PNG formatı
Portable Network Graphics
Chunk tabanlı yapı
PNG, ortalıktaki en derli toplu dosya formatlarından biri. Her şey "chunk" denen, kendi türü, verisi ve sağlama toplamı olan bağımsız bloklar hâlinde düzenlenir. İşin zarif tarafı, çözücülerin anlamadıkları chunk'ları atlayabilmesi. PNG'nin eski yazılımları bozmadan meta veri desteklemesi de bu sayede oluyor.
Asıl akıllıca kısım chunk adlandırmasında: ilk harf büyükse chunk "kritiktir", yani o olmadan görsel görüntülenmez. Küçük harf ise "yardımcı" demektir, olsa iyi olur ama şart değil. Bizi ilgilendiren meta veri chunk'larının hepsi yardımcı, onları gönül rahatlığıyla silebilmemizin sebebi de bu.
PNG dosya yapısı
PNG imzası ve IHDR
| Offset | Hex | ASCII | |||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0000 | 89504E470D0A1A0A0000000D49484452 | .PNG........IHDR | |||||||||||||||
| 0010 | 00000100000001000802000000000000 | ............. | |||||||||||||||
Chunk yapısı
Chunk adlandırma kuralı
- • İlk harf büyük = Kritik chunk (mutlaka anlaşılması gerekir)
- • İlk harf küçük = Yardımcı chunk (isteğe bağlı, yok sayılabilir)
- • İkinci harf = Herkese açık (büyük harf) ya da özel (küçük harf)
Kritik chunk'lar
Görselin geçerli sayılması için bu chunk'ların dosyada bulunması ve anlaşılması gerekir. PicScrub kritik chunk'ları her zaman korur.
IHDR:Görsel başlığı
İmzadan sonraki ilk chunk. Genişlik, yükseklik, bit derinliği, renk türü, sıkıştırma yöntemi, filtre yöntemi ve interlace yöntemini içerir. Tam olarak 13 baytlık veri taşır.
IDAT:Görsel verisi
Sıkıştırılmış (zlib/deflate) görsel verisini içerir. Birden fazla IDAT chunk'ına bölünmüş olabilir. Bütün IDAT chunk'ları art arda gelmelidir.
IEND:Görsel sonu
PNG veri akışının sonunu işaretler. Dosyadaki son chunk olmak zorundadır. Hiç veri baytı taşımaz.
PLTE:Palet
İndeksli renk kullanan görseller (renk türü 3) için zorunludur. 1–256 arası RGB palet girdisi içerir.
Meta veri chunk'ları
Gizlilik açısından hassas meta veriler barındırabilen yardımcı chunk'lar. PicScrub'ın sildiği chunk'lar bunlar.
tEXt:Sıkıştırılmamış metin
Latin-1 kodlamasında anahtar-değer çiftleri. Sık görülen anahtarlar: Author, Description, Copyright, Creation Time, Software.
zTXt:Sıkıştırılmış metin
tEXt ile aynı, tek farkı zlib ile sıkıştırılmış olması. Daha uzun metinler için kullanılır.
iTXt:Uluslararası metin
İsteğe bağlı sıkıştırmalı UTF-8 metin. Dil etiketlerini ve çevrilmiş anahtarları destekler. XMP meta verileri için kullanılır.
XML:com.adobe.xmp\0eXIf:EXIF verisi
2017'de PNG uzantısı olarak kayda geçti. TIFF biçiminde ham EXIF verisi içerir, yapısı JPEG EXIF ile aynıdır. GPS, tarih ve saat, cihaz bilgisi barındırabilir.
iCCP:ICC renk profili
Gömülü ICC renk profili. zlib ile sıkıştırılır. PicScrub renkler bozulmasın diye bunu varsayılan olarak korur.
tIME:Son değişiklik zamanı
Yedi bayt: yıl (2), ay, gün, saat, dakika, saniye. Görselin en son ne zaman değiştirildiğini ele verir.
Renkle ilgili chunk'lar
Bu chunk'lar renklerin nasıl görüntüleneceğini etkiler ama genellikle kişisel bilgi içermez. PicScrub bunları varsayılan olarak korur.
sRGB
sRGB renk uzayını belirtir. İşleme amacı için tek bayt.
gAMA
4 baytlık işaretsiz tamsayı olarak gama değeri (100.000 ile ölçeklenmiş).
cHRM
Ana renklerin kromatiklik değerleri ve beyaz nokta koordinatları.
sBIT
Her kanal için orijinal örnek bit derinlikleri.
CRC32 doğrulaması
Her PNG chunk'ı, chunk türü ve verisi üzerinden hesaplanan bir CRC32 sağlama toplamı içerir. Bu, verinin bozulmadığını garanti eder.
CRC hesabı
CRC32 input = chunk_type (4 bytes) + chunk_data (N bytes) CRC32 output = 4 bytes appended after chunk data // PNG şu CRC-32 polinomunu kullanır: 0xEDB88320
PicScrub neden CRC doğruluyor
PNG dosyalarını okurken PicScrub, verinin bozulmadığından emin olmak için her chunk'ın CRC değerini doğrular. Bozuk chunk'lar sorun çıkarmadan ele alınır.
PicScrub PNG dosyalarını nasıl işliyor
İmzayı doğrula
PNG imzasını kontrol et: 89 50 4E 47 0D 0A 1A 0A
Chunk'ları çözümle
Her chunk'ın uzunluğunu ve türünü oku, CRC değerini doğrula
Meta veri chunk'larını ayıkla
tEXt, zTXt, iTXt, eXIf ve tIME chunk'larını tespit et ve atla
Dosyayı yeniden kur
İmza + ayıklanmış chunk'lar + IEND yaz
Korunan chunk'lar
- • IHDR, PLTE, IDAT, IEND (kritik)
- • sRGB, gAMA, cHRM (renk)
- • iCCP (renk profili, isteğe bağlı)
- • pHYs (piksel boyutları)
- • tRNS (şeffaflık)
Silinen chunk'lar
- • tEXt (metin meta verisi)
- • zTXt (sıkıştırılmış metin)
- • iTXt (uluslararası metin, XMP)
- • eXIf (EXIF verisi)
- • tIME (değişiklik zamanı)