Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

zapis bitowy w pliku bmp


Rekomendowane odpowiedzi

Opublikowano

Hej, mam taki oto problem ze zrozumieniem jak działa zapis koloru w plikach bmp:

Załóżmy, że mamy bitmapę 32bit - czyli kolory R,G,B i kanał alpha.

Wszędzie w internecie podają, że zapis bitmapy w pamięci to kolejne bajty: Blue, Green, Red, Alpha (w takiej przynajmniej kolejności są po odczycie za pomocą np ScanLine).

Używam więc sobie ScanLine i wartości odczytanych czwórek bajtów (B,G,R,A) przechowuję w tablicy jako liczbę czterobajtową (w delphi akurat jako cardinal).

Teraz taką liczbę typu cardinal zamieniam sobie na liczbę dwójkową, dzielę na poszczególne bajty i po porównaniu z wartościami dla poszczególnych kolorów uzyskanymi inną metodą mam ewidentnie kolejność: Alpha, Red, Green, Blue.

 

 

Dla przykładu:

za pomocą scanline uzyskuję liczbę: 4282589803

czyli dwójkowo: 11111111 01000011 00100010 01101011

za pomocą metody Pixels() z bitmapy pobieram ten kolor, rozbijam go na składowe R,G,B i sprawdzam ich zapis dwójkowy. No i mam: R=01000011, G=00100010, B=01101011. Pozostaje przypisać A=11111111 i mamy kolejność A,R,G,B czyli odwrotnie niż miało być.

 

I teraz nie wiem gdzie popełniam błąd. Źle interpretuję zapis bitowy liczby cardinal? Liczby są zapisywane bajtami w odwrotnej kolejności?

Opublikowano

To nie jest błąd, są różne metody zapisu, tu jest :  ARGB_8888.
Dajesz nagłówek do pliku BMP, czy na surowo walisz kolor po kolorze?

Opublikowano

To właściwie nie jest plik tylko zmienna typu TBitmap w delphi. Poza wymiarami i ustawieniem palety na 32bit nic w niej nie zmieniam. Do tej zmiennej kopiowane są dane z DC innego okna.

Właśnie dziwi mnie to, że we wszystkich materiałach w internecie dotyczących ScanLine podkreśla się, żeby pamiętać o odpowiedniej kolejności poszczególnych bajtów opisujących kolory. Nigdzie nic nie jest wspomniane o bitmapach z inną metodą zapisu. A tu ewidentnie kolejność odwrotna.

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...