Format PNG
Portable Network Graphics
Struktur berbasis chunk
PNG punya salah satu format file paling rapi yang ada. Semuanya tersusun dalam "chunk", yaitu blok mandiri yang punya tipe, data, dan checksum sendiri. Bagian eleganya, dekoder bisa melewati chunk yang tidak dia pahami, dan begitulah PNG bisa mendukung metadata tanpa membuat software lama jadi rusak.
Yang cerdik ada di cara penamaan chunk-nya: kalau huruf pertamanya kapital, chunk itu "kritis" (tanpa dia, gambarnya tidak akan tampil). Huruf kecil berarti "pelengkap", yaitu enak kalau ada tapi tidak wajib. Semua chunk metadata yang kami urusi sifatnya pelengkap, dan karena itulah kami bisa membuangnya dengan aman.
Struktur file PNG
Signature PNG dan IHDR
| Offset | Hex | ASCII | |||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0000 | 89504E470D0A1A0A0000000D49484452 | .PNG........IHDR | |||||||||||||||
| 0010 | 00000100000001000802000000000000 | ............. | |||||||||||||||
Struktur sebuah chunk
Aturan penamaan tipe chunk
- • Huruf pertama kapital = chunk kritis (harus dipahami)
- • Huruf pertama kecil = chunk pelengkap (opsional, boleh diabaikan)
- • Huruf kedua = publik (kapital) atau privat (huruf kecil)
Chunk kritis
Chunk-chunk ini harus ada dan harus dipahami supaya gambarnya valid. PicScrub selalu mempertahankan chunk kritis.
IHDR:Header gambar
Chunk pertama setelah signature. Berisi lebar, tinggi, kedalaman bit, tipe warna, metode kompresi, metode filter, dan metode interlace. Datanya persis 13 byte.
IDAT:Data gambar
Berisi data gambar yang terkompresi (zlib/deflate). Bisa terpecah ke beberapa chunk IDAT. Semua chunk IDAT harus berurutan.
IEND:Akhir gambar
Menandai akhir aliran data PNG. Harus jadi chunk terakhir. Tidak punya byte data sama sekali.
PLTE:Palet
Wajib untuk gambar berwarna terindeks (tipe warna 3). Berisi 1–256 entri palet RGB.
Chunk metadata
Chunk pelengkap yang bisa memuat metadata sensitif buat privasi. Inilah chunk yang dihapus PicScrub.
tEXt:Teks tanpa kompresi
Pasangan kunci-nilai dalam pengodean Latin-1. Kunci yang umum: Author, Description, Copyright, Creation Time, Software.
zTXt:Teks terkompresi
Sama seperti tEXt tapi dikompresi dengan zlib. Dipakai untuk teks yang lebih panjang.
iTXt:Teks internasional
Teks UTF-8 dengan kompresi opsional. Mendukung penanda bahasa dan kata kunci yang diterjemahkan. Dipakai untuk metadata XMP.
XML:com.adobe.xmp\0eXIf:Data EXIF
Terdaftar sebagai ekstensi PNG pada 2017. Berisi data EXIF mentah dalam format TIFF, strukturnya sama dengan EXIF di JPEG. Bisa memuat GPS, cap waktu, dan info perangkat.
iCCP:Profil warna ICC
Profil warna ICC yang tertanam. Dikompresi dengan zlib. PicScrub mempertahankannya secara bawaan supaya warnanya tetap akurat.
tIME:Waktu perubahan terakhir
Tujuh byte: tahun (2), bulan, hari, jam, menit, detik. Membocorkan kapan gambar itu terakhir diubah.
Chunk yang berkaitan dengan warna
Chunk-chunk ini memengaruhi tampilan warna, tapi biasanya tidak memuat informasi pribadi. PicScrub mempertahankannya secara bawaan.
sRGB
Menandakan ruang warna sRGB. Satu byte untuk rendering intent.
gAMA
Nilai gamma sebagai bilangan bulat tanpa tanda 4 byte (dikalikan 100.000).
cHRM
Kromatisitas warna primer dan koordinat titik putih.
sBIT
Kedalaman bit sampel asli untuk tiap kanal.
Verifikasi CRC32
Tiap chunk PNG membawa checksum CRC32 yang dihitung dari tipe chunk dan datanya. Ini menjaga keutuhan datanya.
Perhitungan CRC
CRC32 input = chunk_type (4 bytes) + chunk_data (N bytes) CRC32 output = 4 bytes appended after chunk data // PNG uses CRC-32 polynomial: 0xEDB88320
Kenapa PicScrub memvalidasi CRC
Saat membaca file PNG, PicScrub memvalidasi CRC tiap chunk untuk memastikan datanya utuh. Chunk yang rusak ditangani dengan mulus.
Bagaimana PicScrub memproses PNG
Memeriksa signature
Mengecek signature PNG: 89 50 4E 47 0D 0A 1A 0A
Membaca chunk
Membaca panjang dan tipe tiap chunk, lalu memvalidasi CRC-nya
Menyaring chunk metadata
Mengenali lalu melewati chunk tEXt, zTXt, iTXt, eXIf, dan tIME
Menyusun ulang file
Menulis signature + chunk yang lolos saringan + IEND
Chunk yang dipertahankan
- • IHDR, PLTE, IDAT, IEND (kritis)
- • sRGB, gAMA, cHRM (warna)
- • iCCP (profil warna, opsional)
- • pHYs (dimensi piksel)
- • tRNS (transparansi)
Chunk yang dihapus
- • tEXt (metadata teks)
- • zTXt (teks terkompresi)
- • iTXt (teks internasional, XMP)
- • eXIf (data EXIF)
- • tIME (waktu perubahan)