Stworzyłem kilka 4x4 pikselowych, 16-bitowych odcieni szarości, obrazów w Photoshopie i zapisałem je jako nieskompresowane, bez przeplotu, pliki PNG. Próbuję napisać program, aby wyodrębnić dane obrazu z tych plików, ale trochę się pomyliłem z porcją IDAT. Ma to na celu samokształcenie, więc nie używam biblioteki.Jak odkodować porcję IDAT pliku PNG bez kompresji
Oto kod szesnastkowy dla fragmentu IDAT jednego z obrazów, gdzie każdy piksel jest biały.
mam kolorami co wierzę rozumiem w tym momencie.
Czerwony = Zignoruj, ponieważ jest częścią porcji IEND i nie dotyczy IDAT.
Żółty = Informacja o porcji. Pierwsze 4 żółte bajty to długość danych. Drugie 4 żółte bajty to identyfikator kawałka. Ostatnie 4 żółte bajty na końcu obrazu to Cykliczna kontrola nadmiarowa.
Niebieski = Informacja o formacie kompresji zlib. Gdzie pierwszy niebieski bajt to metoda kompresji i informacja o kompresji. Drugi niebieski bajt to informacje o flagach. Ostatnie cztery niebieskie bajty w dolnej części obrazu to suma kontrolna ADLER-32. Zakładam, że w tym przypadku nie ma DICTID.
Szary = Informacja dla algorytmu kompresji Deflate. W pierwszym szarym bajcie, bit jeden jest ostatnim znacznikiem bloku, a bity dwa i trzy są metodą kodowania. Reszta pierwszego szarego bajtu jest ignorowana. Ponieważ ta metoda jest metodą nieskompresowaną, drugi i trzeci szary bajt to długość bajtów danych w bloku, a czwarty i piąty szary bajt stanowią komplement drugiego i trzeciego szarego bajtu.
Bez ramki = Dane obrazu skompresowane algorytmem LZ77 (bez kodu Huffmana z powodu metody bez kompresji) z algorytmem wykorzystującym 8 bitów dla potencjalnej długości duplikatów i 15 bitów dla odległości wyszukiwania wstecznego.
Albo rozumiem coś niepoprawnie, albo nie rozumiem, jak rozszyfrować bajty w obrazie bez ramki poprawnie używając algorytmu LZ77. Jeśli ktoś może mnie poprawić lub pokazać to, czego nie rozumiem, byłbym bardzo wdzięczny. Dziękuję Ci.
Dodano kilka tagów ... Wygląda również na to, że żółta partia początkowa/końcowa IDAT została poprawnie zdekodowana "(rozmiar + 12 znaków BYTE)" przynajmniej jest taka sama na testowanych urządzeniach. – Spektre