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, botów: 0