Format TIFF
Tagged Image File Format
Struktur header
TIFF adalah kakek moyangnya metadata gambar. Saat kamu melihat data EXIF di sebuah JPEG, itu sebenarnya struktur TIFF yang tertanam di dalam filenya. Memahami TIFF berarti memahami cara kerja hampir semua metadata gambar.
Formatnya dibuka dengan header 8 byte yang memberi tahu dua hal penting: urutan bytenya (Intel atau Motorola) dan di mana IFD pertamanya berada. Setelah itu, kerjanya tinggal mengikuti pointer.
Struktur file TIFF
Header TIFF
| Offset | Hex | ASCII | |||||||
|---|---|---|---|---|---|---|---|---|---|
| 0000 | 49492A0008000000 | II*..... | |||||||
Urutan byte
49 49 (II)Intel:little-endian (byte paling tidak signifikan lebih dulu)
4D 4D (MM)Motorola:big-endian (byte paling signifikan lebih dulu)
Struktur IFD
IFD singkatan dari Image File Directory, tapi bayangkan saja dia sebagai daftar isi. Isinya daftar tag yang datar, masing-masing menunjuk ke sepotong data. Bagian cerdiknya, IFD bisa menunjuk ke IFD lain, sehingga terbentuk struktur pohon.
Susunan IFD
Struktur satu entri tag (12 byte)
Kalau datanya muat dalam 4 byte, nilainya disimpan langsung di kolom nilai. Kalau tidak, kolom itu berisi offset menuju datanya.
Tipe tag
TIFF punya sistem tipe yang ketat. Tiap tag tidak hanya menyebut apa isinya, tapi juga bagaimana bytenya harus dibaca. Karena itu kamu perlu paham sistem tipenya supaya bisa membaca TIFF dengan benar.
| ID | Nama | Ukuran | Keterangan |
|---|---|---|---|
| 1 | BYTE | 1 | Bilangan bulat 8 bit tanpa tanda |
| 2 | ASCII | 1 | String berakhiran null (8 bit) |
| 3 | SHORT | 2 | Bilangan bulat 16 bit tanpa tanda |
| 4 | LONG | 4 | Bilangan bulat 32 bit tanpa tanda |
| 5 | RATIONAL | 8 | Dua LONG: pembilang/penyebut |
| 6 | SBYTE | 1 | Bilangan bulat 8 bit bertanda |
| 7 | UNDEFINED | 1 | Byte mentah (data biner) |
| 8 | SSHORT | 2 | Bilangan bulat 16 bit bertanda |
| 9 | SLONG | 4 | Bilangan bulat 32 bit bertanda |
| 10 | SRATIONAL | 8 | Dua SLONG: pembilang/penyebut bertanda |
| 11 | FLOAT | 4 | Float 32 bit IEEE |
| 12 | DOUBLE | 8 | Double 64 bit IEEE |
| 13 | IFD | 4 | Pointer ke IFD bersarang |
Aturan penyimpanan nilai
Kalau ukuran × jumlah ≤ 4 byte, nilainya disimpan langsung di kolom nilai yang 4 byte itu. Kalau tidak, kolom tersebut berisi offset yang menunjuk ke tempat datanya disimpan di dalam file.
Menghitung offset IFD
Bagian tersulit saat membaca TIFF adalah mengikuti rantai offsetnya. Semuanya relatif terhadap awal file, dan kamu bakal melompat ke sana-sini cukup sering. Beginilah hitungannya:
IFD0_offset = bytes[4:8] // Dari header TIFF
next_IFD = IFD0_offset + 2 + (entry_count × 12) + 4
subIFD_offset = tag_value // Dari tag pointer (0x8769, 0x8825)
Tag yang penting
Tag data gambar (dipertahankan)
0x0100:ImageWidth0x0101:ImageLength0x0102:BitsPerSample0x0103:Compression0x0111:StripOffsets0x0117:StripByteCountsTag metadata (dihapus)
0x010F:Make (merek kamera)0x0110:Model (model kamera)0x0132:DateTime0x013B:Artist0x8298:Copyright0x9003:DateTimeOriginalTag pointer (sub-IFD)
0x8769:ExifIFDPointer0x8825:GPSInfoIFDPointer0xA005:InteroperabilityIFDPointerSubIFD
IFD utama (IFD0) sering memuat "tag pointer" yang merujuk ke subdirektori. Begitulah caranya EXIF, GPS, dan metadata lainnya dikelompokkan secara logis sambil menjaga IFD utamanya tetap rapi.
SubIFD EXIF
Berisi metadata khas kamera: eksposur, bukaan, ISO, panjang fokus, lampu kilat, white balance, dan lainnya.
SubIFD GPS
Berisi data geolokasi: garis lintang, garis bujur, ketinggian, cap waktu, jumlah satelit, kecepatan, dan arah. Masalah privasi yang besar.
Maker Note
Data kamera milik pabrikan. Formatnya beda-beda tiap merek. Bisa memuat nomor seri, versi firmware, dan pengaturan kustom.
Bagaimana PicScrub memproses TIFF
Membaca header
Menentukan urutan byte (II/MM) dan mencari IFD pertama
Menyusun daftar tag aman
Mengenali tag mana yang memang dibutuhkan untuk menampilkan gambar
Menyaring entri IFD
Membuang tag metadata dan menolkan pointer SubIFD-nya
Menulis ulang file
Menyusun ulang TIFF dengan IFD yang bersih dan data gambar yang disalin apa adanya
Perhitungan ulang offset
File TIFF sangat bergantung pada offset. Begitu metadatanya dihapus, PicScrub harus menghitung ulang semua offsetnya supaya filenya tetap utuh.