PicScrub logoPicScrub
Wróć do formatów

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

Signature
IHDR
Metadata
IDAT
IEND
Signature
8 B
89 50 4E 47 0D 0A 1A 0A
IHDR
25 B
Nagłówek obrazu (wymagany)
Metadata
100 B
Chunki tEXt, iTXt, eXIf
IDAT
Zmienna długość
Skompresowane dane obrazu
IEND
12 B
Znacznik końca obrazu

Sygnatura PNG i chunk IHDR

Sygnatura PNG
Długość IHDR (13)
Typ IHDR
Szerokość (256)
Wysokość (256)
Głębia bitowa, typ koloru itd.
OffsetHexASCII
0000
89504E470D0A1A0A0000000D49484452
.PNG........IHDR
0010
00000100000001000802000000000000
.............

Budowa chunka

DługośćTypDaneCRC32
4 bajty4 bajtyZmienna4 bajty

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.

Format: keyword + null + text

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.

Słowo kluczowe XMP: XML:com.adobe.xmp\0

eXIf: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

1

Sprawdzenie sygnatury

Weryfikacja sygnatury PNG: 89 50 4E 47 0D 0A 1A 0A

2

Analiza chunków

Odczyt długości i typu każdego chunka oraz weryfikacja CRC

3

Odfiltrowanie chunków z metadanymi

Rozpoznanie i pominięcie chunków tEXt, zTXt, iTXt, eXIf i tIME

4

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)