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]

- Rejestracja:ponad 13 lat
- Ostatnio:około 10 godzin
- Lokalizacja:Tuchów
- Postów:12176
@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.
- Rejestracja:ponad 6 lat
- Ostatnio:prawie 6 lat
- Postów:23
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.

- Rejestracja:ponad 13 lat
- Ostatnio:około 10 godzin
- Lokalizacja:Tuchów
- Postów:12176
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ść.

- Rejestracja:ponad 6 lat
- Ostatnio:około 2 lata
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

- Rejestracja:ponad 18 lat
- Ostatnio:26 dni
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.



Zarejestruj się i dołącz do największej społeczności programistów w Polsce.
Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.