[#1] Jak zamienic kolory w bitmapie
Czesc
chodzi mi o ten manewr co w DPaint kryje sie pod nazwa Remap w menu kolorow.
Czyli innymi slowy: jesli zamienie miejscami 2 kolory w palecie (np kolor 2 z kolorem 10) to obrazek sie wizualnie zepsuje bo piksele co mialy kolor 2 dostana kolor 10 i odwrotnie.
Wybierajac teraz ten caly "Remap" obrazek sie naprawia mimo ze kolor 10 jest dalej na pozycji koloru 2 i odwrotnie.

Czy ja mam jechac piksel po pikselu przez cala bitmape i zamieniac odpowiednie kolory?
[#2] Re: Jak zamienic kolory w bitmapie

@pch, post #1

tak :D jak nazwa wskazuje najlepiej miec do tego wykonana mape gdzie klucz odpowiada starej wartosci, a wartosc to nowy kolor. wtedy wystarczy pixel po pixelu wstawic na nowo, gdzie stara wskaznikiem wlasnie jest stara wartosc a nowa wartoscia dana wlasnie wskazana w mapie.
oczywiscie tryb planarny nie upraszcza sprawy, bo trzeba pooperowac na bitach

Ostatnia aktualizacja: 18.12.2021 07:06:27 przez juen
[#3] Re: Jak zamienic kolory w bitmapie

@juen, post #2

Bardzo mnie uradowales
Dzieki, heh.
[#4] Re: Jak zamienic kolory w bitmapie

@juen, post #2

Chyba pojde na latwizne i uzyje komendy blitza: Remap #no1,#no2
... tylko musze wykombinowac jak pogodzic funkcje systemowe z wbudowanymi Blitz-a, bo w tej chwili podajac jako #no1 i #no2 indexy z colorMap to amiga gUruje :)
[#5] Re: Jak zamienic kolory w bitmapie

@pch, post #4

Można rzeczywiście przejść po pikselach Chunky i dokonać odpowiedniego mapowania.

Jest to dosyć wygodne - po prostu odczytujesz i zapisujesz wartości bajtowe pikseli, wymaga to konwersji Chunky.

Istnieje też inna metoda na podmianę kolorów - używam podobnego schematu do tworzenia maski bitowej z pikselami przeźroczystymi dla BOBów.

Idea polega na tym, że odczytujemy maskę bitową pikseli o podanej wartości.

Ta maska ma ustawiony bit 1 wszędzie tam, gdzie są piksele o podanym kolorze.

Poniżej szybka implementacja: Pierwsza funkcja odczytuje maskę bitową dla podanego koloru. Druga zaś zapisuje maskę bitową w miejsce podanego koloru, czyli zastępuje wszystkie te piksele nowym kolorem.

Używam Blittera. "Minterm" to rodzaj operacji logicznej wykonywanej na bitach.

W przypadku funkcji BltBitMap() podajemy operację logiczną mając:
  • w kanale B dane źródłowe oraz,
  • w C dane docelowe.

Przy odczycie:
  • na starcie mam maskę złożoną z samych wartości 1,
  • Dla bitplanów o wartości 1, robię D=BC (koniunkcja bitowa),
  • Dla bitplanów o wartości 0, robię D=bC (koniunkcja negacji bitowej)

W rezultacie otrzymując maskę bitową koloru kodowanego tymi bitami.

Przy zapisie:
  • dla bitplanów o wartości 1, dodaję te bity, czyli robię D=B+C (alternatywa bitowa)
  • Dla bitplanów o wartości 0, usuwam (tzw. mask out) te bity za pomocą D=bC.

W rezultacie piksele określone przez maskę zostają ustawione na podany nowy kolor.

/* Odczyt */
PLANEPTR ReadColorMask(UBYTE color)
{
	PLANEPTR mask = AllocRaster(width, height);
	struct BitMap aux;
	InitBitMap(&aux, depth, width, height);
	
	WORD i;

	BltClear(mask, RASSIZE(width, height), 0x04 | (0xffff << 16));
	
	for (i = 0; i < depth; i++)
	{
		aux.Planes[i] = mask;
	}
	for (i = 0; i < depth; i++)
	{
		UBYTE minterm;
	
		if (color & (1 << i))
		{
			minterm = ABC;
		}
		else
		{
			minterm = ANBC;
		}

		BltBitMap(bm, 0, 0, &aux, 0, 0, width, height, minterm, 1 << i, NULL);
	}
	return(mask);
}

/* Zapis */
VOID WriteColorMask(PLANEPTR mask, UBYTE color)
{
	struct BitMap aux;
	InitBitMap(&aux, depth, width, height);
	
	WORD i;
	for (i = 0; i < depth; i++)
	{
		aux.Planes[i] = mask;
	}

	for (i = 0; i < depth; i++)
	{
		UBYTE minterm;
	
		if (color & (1 << i))
		{
			minterm = ABC|ABNC|ANBC;
		}
		else
		{
			minterm = ANBC;
		}

		BltBitMap(&aux, 0, 0, bm, 0, 0, width, height, minterm, 1 << i, NULL);
	}
}
[#6] Re: Jak zamienic kolory w bitmapie

@Hexmage960, post #5

.. no i mam gotowca - w koncu bedzie latwo
Dzieki OK
[#7] Re: Jak zamienic kolory w bitmapie

@pch, post #6

Żeby dokonać zamiany koloru 2 i 10 należy wywołać te funkcje w następujący sposób:

PLANEPTR mask2  = ReadColorMask(2);
PLANEPTR mask10 = ReadColorMask(10);

WriteColorMask(mask10, 2);
WriteColorMask(mask2, 10);

Kod powinien działać poprawnie.

W przypadku metody z Chunky należy użyć funkcji ReadPixelArray8() i WritePixelArray8(). Jest to sporo wygodniejsze.
[#8] Re: Jak zamienic kolory w bitmapie

@Hexmage960, post #7

i to wszystko ma sens przy zamianie jednego koloru ale przy przetasowaniu palety najszybsze będzie mapowanie
[#9] Re: Jak zamienic kolory w bitmapie

@juen, post #8

Na te chwile i tak nie wiem jak to jescze zrobie.
Mialem pomysl by przy kazdej podmianie dwoch kolorow robil sie remap ale chyba jednak dam mozliwosc przetasowania ilu sie chce i na koniec reczny start "przekolorowania", by ogarnac wszytsko na raz.
[#10] Re: Jak zamienic kolory w bitmapie

@pch, post #1

DP już dawno nie używałem, ale w Personelu jest Przekoloruj jak pozamieniasz piksele
[#11] Re: Jak zamienic kolory w bitmapie

@don_rafito, post #10

Tak, i to samo wlasnie mam na mysli w dpaint.
I chyba tam nie zauwazylem by byla roznica w czasie gdy podmieniam 2 kolory czy 10
Na stronie www.PPA.pl, podobnie jak na wielu innych stronach internetowych, wykorzystywane są tzw. cookies (ciasteczka). Służą ona m.in. do tego, aby zalogować się na swoje konto, czy brać udział w ankietach. Ze względu na nowe regulacje prawne jesteśmy zobowiązani do poinformowania Cię o tym w wyraźniejszy niż dotychczas sposób. Dalsze korzystanie z naszej strony bez zmiany ustawień przeglądarki internetowej będzie oznaczać, że zgadzasz się na ich wykorzystywanie.
OK, rozumiem