TIFF formatı
Tagged Image File Format
Başlık yapısı
TIFF, görsel meta verisinin dedesi sayılır. Bir JPEG dosyasının içinde EXIF verisi gördüğünde aslında dosyaya gömülmüş bir TIFF yapısına bakıyorsun. TIFF'i anlamak, görsel meta verilerinin büyük kısmının nasıl çalıştığını anlamak demek.
Format, sana iki kritik bilgiyi veren 8 baytlık bir başlıkla başlar: bayt sırası (Intel mi, Motorola mı) ve ilk IFD'nin nerede olduğu. Sonrası tamamen işaretçi takibinden ibaret.
TIFF dosya yapısı
TIFF başlığı
| Offset | Hex | ASCII | |||||||
|---|---|---|---|---|---|---|---|---|---|
| 0000 | 49492A0008000000 | II*..... | |||||||
Bayt sırası
49 49 (II)Intel:Little-endian (en düşük değerlikli bayt önce)
4D 4D (MM)Motorola:Big-endian (en yüksek değerlikli bayt önce)
IFD yapısı
IFD, Image File Directory'nin kısaltması ama sen onu bir içindekiler tablosu gibi düşün. Her biri bir veri parçasına işaret eden düz bir etiket listesi. İşin akıllıca tarafı, IFD'lerin başka IFD'lere işaret ederek ağaç benzeri bir yapı kurabilmesi.
IFD düzeni
Etiket girdisinin yapısı (12 bayt)
Veri 4 bayta sığıyorsa doğrudan değer alanında saklanır. Sığmıyorsa değer alanı, verinin bulunduğu yere işaret eden bir offset taşır.
Etiket türleri
TIFF sıkı tiplidir. Her etiket sadece neyi içerdiğini değil, baytların nasıl yorumlanacağını da belirtir. TIFF'i doğru çözümlemek için tür sistemini anlaman gerekmesinin sebebi de bu.
| ID | Ad | Boyut | Açıklama |
|---|---|---|---|
| 1 | BYTE | 1 | İşaretsiz 8 bit tamsayı |
| 2 | ASCII | 1 | Null ile biten dizge (8 bit) |
| 3 | SHORT | 2 | İşaretsiz 16 bit tamsayı |
| 4 | LONG | 4 | İşaretsiz 32 bit tamsayı |
| 5 | RATIONAL | 8 | İki LONG: pay/payda |
| 6 | SBYTE | 1 | İşaretli 8 bit tamsayı |
| 7 | UNDEFINED | 1 | Ham baytlar (ikili veri) |
| 8 | SSHORT | 2 | İşaretli 16 bit tamsayı |
| 9 | SLONG | 4 | İşaretli 32 bit tamsayı |
| 10 | SRATIONAL | 8 | İki SLONG: işaretli pay/payda |
| 11 | FLOAT | 4 | IEEE 32 bit kayan noktalı sayı |
| 12 | DOUBLE | 8 | IEEE 64 bit çift duyarlıklı sayı |
| 13 | IFD | 4 | İç içe IFD'ye işaretçi |
Değer saklama kuralı
boyut × adet ≤ 4 baytsa değer doğrudan 4 baytlık değer alanında saklanır. Değilse bu alan, verinin dosyanın neresinde durduğunu gösteren bir offset taşır.
IFD offset hesapları
TIFF çözümlemenin en zor kısmı offset zincirini takip etmek. Her şey dosyanın başlangıcına göre hesaplanır ve dosyanın içinde bir sürü kez ileri geri zıplarsın. Matematiği şöyle işliyor:
IFD0_offset = bytes[4:8] // TIFF başlığından
next_IFD = IFD0_offset + 2 + (entry_count × 12) + 4
subIFD_offset = tag_value // İşaretçi etiketinden (0x8769, 0x8825)
Önemli etiketler
Görsel verisi etiketleri (korunur)
0x0100:ImageWidth0x0101:ImageLength0x0102:BitsPerSample0x0103:Compression0x0111:StripOffsets0x0117:StripByteCountsMeta veri etiketleri (silinir)
0x010F:Make (kameranın markası)0x0110:Model (kameranın modeli)0x0132:DateTime0x013B:Artist0x8298:Copyright0x9003:DateTimeOriginalİşaretçi etiketleri (alt IFD'ler)
0x8769:ExifIFDPointer0x8825:GPSInfoIFDPointer0xA005:InteroperabilityIFDPointerAlt IFD'ler
Ana IFD (IFD0) çoğu zaman alt dizinlere referans veren "işaretçi etiketleri" içerir. EXIF, GPS ve diğer meta veriler böylece mantıklı gruplara ayrılır, ana IFD de derli toplu kalır.
EXIF alt IFD'si
Kameraya özel meta verileri içerir: pozlama, diyafram, ISO, odak uzaklığı, flaş, beyaz dengesi ve daha fazlası.
GPS alt IFD'si
Konum verilerini içerir: enlem, boylam, rakım, zaman damgası, uydular, hız, yön. Ciddi bir gizlilik sorunu.
Üretici notları
Kameraya özel tescilli veriler. Biçimi üreticiden üreticiye değişir. Seri numaraları, ürün yazılımı sürümü ve özel ayarlar barındırabilir.
PicScrub TIFF dosyalarını nasıl işliyor
Başlığı çözümle
Bayt sırasını (II/MM) belirle ve ilk IFD'yi bul
Etiket beyaz listesini oluştur
Görselin görüntülenmesi için gerekli etiketleri belirle
IFD girdilerini ayıkla
Meta veri etiketlerini sil, alt IFD işaretçilerini sıfırla
Dosyayı yeniden yaz
TIFF dosyasını temiz IFD'ler ve kopyalanan görsel verisiyle yeniden kur
Offset'lerin yeniden hesaplanması
TIFF dosyaları offset'leri bolca kullanır. Meta veriler silindiğinde PicScrub, dosyanın bütünlüğü korunsun diye bütün offset'leri yeniden hesaplamak zorundadır.