Format PNG
Portable Network Graphics
Struktura oparta na chunkach
PNG ma jeden z najczystszych formatów plików, jakie istnieją. Wszystko jest ułożone w „chunki”, czyli samodzielne bloki z typem, danymi i sumą kontrolną. Najbardziej eleganckie jest to, że dekodery mogą pominąć chunki, których nie rozumieją, i właśnie dlatego PNG obsługuje metadane bez psucia starszego oprogramowania.
Sprytny szczegół siedzi w nazwach chunków: jeśli pierwsza litera jest wielka, chunk jest „krytyczny” (bez niego obraz się nie wyświetli). Mała litera oznacza chunk „pomocniczy”, czyli przydatny, ale nie niezbędny. Wszystkie interesujące nas chunki z metadanymi są pomocnicze i dlatego możemy je bezpiecznie usunąć.
Struktura pliku PNG
Sygnatura PNG i chunk IHDR
| Offset | Hex | ASCII | |||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0000 | 89504E470D0A1A0A0000000D49484452 | .PNG........IHDR | |||||||||||||||
| 0010 | 00000100000001000802000000000000 | ............. | |||||||||||||||
Budowa chunka
Zasady nazywania typów chunków
- • Pierwsza litera wielka = chunk krytyczny (musi być zrozumiany)
- • Pierwsza litera mała = chunk pomocniczy (opcjonalny, można go pominąć)
- • Druga litera = publiczny (wielka) albo prywatny (mała)
Chunki krytyczne
Te chunki muszą być obecne i zrozumiane, żeby obraz był poprawny. PicScrub zawsze je zostawia.
IHDR:nagłówek obrazu
Pierwszy chunk po sygnaturze. Zawiera szerokość, wysokość, głębię bitową, typ koloru, metodę kompresji, metodę filtrowania i sposób przeplotu. Dokładnie 13 bajtów danych.
IDAT:dane obrazu
Zawiera skompresowane (zlib/deflate) dane obrazu. Mogą być rozbite na kilka chunków IDAT. Wszystkie chunki IDAT muszą iść jeden po drugim.
IEND:koniec obrazu
Oznacza koniec strumienia danych PNG. Musi być ostatnim chunkiem. Nie ma żadnych danych.
PLTE:paleta
Wymagany dla obrazów z kolorem indeksowanym (typ koloru 3). Zawiera od 1 do 256 wpisów palety RGB.
Chunki z metadanymi
Chunki pomocnicze, które mogą zawierać metadane wrażliwe dla prywatności. To właśnie je PicScrub usuwa.
tEXt:tekst nieskompresowany
Pary klucz-wartość w kodowaniu Latin-1. Typowe klucze: Author, Description, Copyright, Creation Time, Software.
zTXt:tekst skompresowany
To samo co tEXt, ale z kompresją zlib. Używany do dłuższych tekstów.
iTXt:tekst międzynarodowy
Tekst UTF-8 z opcjonalną kompresją. Obsługuje tagi językowe i przetłumaczone słowa kluczowe. Używany do metadanych XMP.
XML:com.adobe.xmp\0eXIf:dane EXIF
Zarejestrowany jako rozszerzenie PNG w 2017 roku. Zawiera surowe dane EXIF w formacie TIFF, o tej samej strukturze co EXIF w JPEG. Może zawierać GPS, datę i godzinę oraz dane urządzenia.
iCCP:profil koloru ICC
Osadzony profil koloru ICC, skompresowany zlibem. PicScrub domyślnie go zostawia, żeby kolory pozostały wierne.
tIME:czas ostatniej zmiany
Siedem bajtów: rok (2), miesiąc, dzień, godzina, minuta, sekunda. Zdradza, kiedy obraz był ostatnio modyfikowany.
Chunki związane z kolorem
Te chunki wpływają na wyświetlanie kolorów, ale zwykle nie zawierają danych osobowych. PicScrub domyślnie je zostawia.
sRGB
Wskazuje przestrzeń barw sRGB. Jeden bajt określa sposób odwzorowania kolorów.
gAMA
Wartość gamma jako 4-bajtowa liczba bez znaku (przeskalowana przez 100 000).
cHRM
Współrzędne chromatyczności barw podstawowych i punktu bieli.
sBIT
Pierwotna głębia bitowa próbek dla każdego kanału.
Weryfikacja CRC32
Każdy chunk PNG ma sumę kontrolną CRC32 liczoną z typu chunka i jego danych. Dzięki temu wiadomo, że dane są nienaruszone.
Obliczanie CRC
CRC32 input = chunk_type (4 bajty) + chunk_data (N bajtów) CRC32 output = 4 bajty dopisane po danych chunka // PNG używa wielomianu CRC-32: 0xEDB88320
Dlaczego PicScrub sprawdza CRC
Przy odczycie plików PNG PicScrub weryfikuje CRC każdego chunka, żeby mieć pewność, że dane są nienaruszone. Uszkodzone chunki obsługujemy bezpiecznie, bez wywracania całego procesu.
Jak PicScrub przetwarza pliki PNG
Sprawdzenie sygnatury
Weryfikacja sygnatury PNG: 89 50 4E 47 0D 0A 1A 0A
Analiza chunków
Odczyt długości i typu każdego chunka oraz weryfikacja CRC
Odfiltrowanie chunków z metadanymi
Rozpoznanie i pominięcie chunków tEXt, zTXt, iTXt, eXIf i tIME
Złożenie pliku na nowo
Zapis sygnatury, przefiltrowanych chunków i IEND
Chunki, które zostają
- • IHDR, PLTE, IDAT, IEND (krytyczne)
- • sRGB, gAMA, cHRM (kolor)
- • iCCP (profil koloru, opcjonalnie)
- • pHYs (wymiary piksela)
- • tRNS (przezroczystość)
Chunki usuwane
- • tEXt (metadane tekstowe)
- • zTXt (tekst skompresowany)
- • iTXt (tekst międzynarodowy, XMP)
- • eXIf (dane EXIF)
- • tIME (czas modyfikacji)