BMP 16 bitowa 5.5.5.0.1 przyklad

0

Jezeli piksel ma wartosc [10011101] [10001110]
to jakie wartosci maja po kolej R G B i A. Dla mnie takie, czy dobrze rozumiem?
R=[00010011]
G=[00010110]
B=[00000111]
A=[00000000]

0

Dla mnie raczej:

R = 1001
G = 1101
B = 1000
A = 1110

Ale to nie kwestia wyczucia tylko konkretnego formatu danych!

0

@dandon223: przygotuj sobie taką bitmapę w byle edytorze, zapisz na dysku, otwórz w hex-edytorze i sprawdź. Pięć godzin już minęło od założenia wątku, a Ty nadal czekasz nie wiadomo na co.

0

Doceniam rade ale w hexeditorze nie jest to takie proste bo ci przeciez nie pokazuje konkretnie co czyta na R co na G a co B. Ale jakos sobie poradzilem. I jezeli chodzi o wersje 5.5.5.0.1 to jest to tak: x to pierwszy bajt po lewej, R kolejne 5 G kolejne 5 i B ostatnie 5.
PS: Nie wiem czy da sie jakos zakonczyc ten watek lub go usunac,wiec na razie zostawiam.
PPS: Nie czekam na nie wiadomo co, bo dzisiaj siedze nad tym jednym zagadnieniem 8 godzin.

1
dandon223 napisał(a):

Doceniam rade ale w hexeditorze nie jest to takie proste bo ci przeciez nie pokazuje konkretnie co czyta na R co na G a co B.

No jak to? Wybierasz sobie taki kolor, aby wszystkie składowe miały unikalne wartości dla wszystkich kanałów – w ten sposób bez problemu znajdziesz w hex-edytorze po pierwsze gdzie one są (czyli jaki jest offset palety kolorów i gdzie znajdują się dane konkretnych pikseli), a po drugie, jaka jest ich kolejność.

0

Sprawdzenie w hexeditor'ze to jedno.
W poprzednim wątku miałeś link do wiki https://en.wikipedia.org/wiki/BMP_file_format
Na dole strony masz linki zewnętrzne a w nich klasa odczytująca BMP.
Tam możesz sprawdzić rzeczywisty przykład.
Fragmenty:

	bool Load(const char *Filename) {
		...

		if (m_BitmapHeader.Compression == 0) {
		...
					} else if (m_BitmapHeader.BitCount == 16) {
						uint32_t Color = *((uint16_t*) LinePtr);
						m_BitmapData[Index].Red = ((Color >> 10) & 0x1f) << 3;
						m_BitmapData[Index].Green = ((Color >> 5) & 0x1f) << 3;
						m_BitmapData[Index].Blue = (Color & 0x1f) << 3;
						m_BitmapData[Index].Alpha = 255;
						Index++;
						LinePtr += 2;
		...
		} else if (m_BitmapHeader.Compression == 1) { // RLE 8
		...
				if (Count > 0) {
					Index = x + y * GetWidth();
					for (int k = 0; k < Count; k++) {
						m_BitmapData[Index + k].Red = ColorTable[ColorIndex].Red;
						m_BitmapData[Index + k].Green = ColorTable[ColorIndex].Green;
						m_BitmapData[Index + k].Blue = ColorTable[ColorIndex].Blue;
						m_BitmapData[Index + k].Alpha = ColorTable[ColorIndex].Alpha;
					}
		...
		} else if (m_BitmapHeader.Compression == 3) { // BITFIELDS
			
			/* We assumes that mask of each color component can be in any order */

			uint32_t BitCountRed = CColor::BitCountByMask(m_BitmapHeader.RedMask);
			uint32_t BitCountGreen = CColor::BitCountByMask(m_BitmapHeader.GreenMask);
			uint32_t BitCountBlue = CColor::BitCountByMask(m_BitmapHeader.BlueMask);
			uint32_t BitCountAlpha = CColor::BitCountByMask(m_BitmapHeader.AlphaMask);

		...
					m_BitmapData[Index].Red = CColor::Convert(CColor::ComponentByMask(Color, m_BitmapHeader.RedMask), BitCountRed, 8);
					m_BitmapData[Index].Green = CColor::Convert(CColor::ComponentByMask(Color, m_BitmapHeader.GreenMask), BitCountGreen, 8);
					m_BitmapData[Index].Blue = CColor::Convert(CColor::ComponentByMask(Color, m_BitmapHeader.BlueMask), BitCountBlue, 8);
					m_BitmapData[Index].Alpha = CColor::Convert(CColor::ComponentByMask(Color, m_BitmapHeader.AlphaMask), BitCountAlpha, 8);

					Index++;
		...

Całość: http://www.kalytta.com/bitmap.h

2

Typowo 16-bitowy BMP używa rozkładu 5.6.5.0.0, co oznacza 5bit na R i B, a 6 dla G. 5.5.5.0.1 oznacza po pięć bitów na RGB i ostatni bit nie wiem na co, chyba po prostu wypełniacz. Pliki BMP od 16-bit w górę zwykle nie kodują kanału alpha.
Zgodnie z https://en.wikipedia.org/wiki/BMP_file_format znaczenie poszczególnych bitów zapisane jest w nagłówkach, więc bez nagłówka można tylko zgadywać. Chyba najbardziej domyślny rozkład to:
(1) R=00111 G=01100 B=01110 (A=255) , ale wtedy nie wiem czemu nieużywany bit byłby ustawiony na 1.

1 użytkowników online, w tym zalogowanych: 0, gości: 1