PicScrub logoPicScrub
Kembali ke daftar format

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
IHDR
Metadata
IDAT
IEND
Signature
8 byte
89 50 4E 47 0D 0A 1A 0A
IHDR
25 byte
Header gambar (wajib)
Metadata
100 byte
Chunk tEXt, iTXt, dan eXIf
IDAT
Panjang bervariasi
Data gambar terkompresi
IEND
12 byte
Penanda akhir gambar

Signature PNG dan IHDR

Signature PNG
Panjang IHDR (13)
Tipe IHDR
Lebar (256)
Tinggi (256)
Kedalaman bit, tipe warna, dan lainnya
OffsetHexASCII
0000
89504E470D0A1A0A0000000D49484452
.PNG........IHDR
0010
00000100000001000802000000000000
.............

Struktur sebuah chunk

PanjangTipeDataCRC32
4 byte4 byteBervariasi4 byte

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.

Format: keyword + null + text

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.

Kata kunci XMP: XML:com.adobe.xmp\0

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

1

Memeriksa signature

Mengecek signature PNG: 89 50 4E 47 0D 0A 1A 0A

2

Membaca chunk

Membaca panjang dan tipe tiap chunk, lalu memvalidasi CRC-nya

3

Menyaring chunk metadata

Mengenali lalu melewati chunk tEXt, zTXt, iTXt, eXIf, dan tIME

4

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)