TIFF फ़ॉर्मैट
Tagged Image File Format
हेडर का स्ट्रक्चर
इमेज मेटाडेटा का दादा कहिए TIFF को। JPEG में आप जो EXIF डेटा देखते हैं, वह असल में फ़ाइल के अंदर बैठा एक TIFF स्ट्रक्चर ही है। TIFF समझ लिया तो समझिए ज़्यादातर इमेज मेटाडेटा का चलन समझ लिया।
फ़ॉर्मैट की शुरुआत 8 बाइट की हेडर से होती है, जो दो अहम बातें बताती है: बाइट ऑर्डर (Intel या Motorola) और पहला IFD कहाँ मिलेगा। उसके आगे तो बस pointer के पीछे भागते रहना है।
TIFF फ़ाइल का स्ट्रक्चर
TIFF हेडर
| Offset | Hex | ASCII | |||||||
|---|---|---|---|---|---|---|---|---|---|
| 0000 | 49492A0008000000 | II*..... | |||||||
बाइट ऑर्डर
49 49 (II)Intel:little-endian (सबसे कम अहमियत वाला बाइट पहले)
4D 4D (MM)Motorola:big-endian (सबसे ज़्यादा अहमियत वाला बाइट पहले)
IFD का स्ट्रक्चर
IFD का मतलब है Image File Directory, पर इसे विषय-सूची समझिए। यह टैग की एक सपाट सूची होती है, जिसका हर टैग किसी न किसी डेटा की ओर इशारा करता है। मज़े की बात यह है कि एक IFD दूसरे IFD की ओर भी इशारा कर सकता है, और यूँ एक पेड़ जैसा ढाँचा बन जाता है।
IFD की बनावट
टैग एंट्री का स्ट्रक्चर (12 बाइट)
अगर डेटा 4 बाइट में समा जाए, तो वह सीधे value फ़ील्ड में ही रख दिया जाता है। वरना value फ़ील्ड में डेटा तक पहुँचने का offset रहता है।
टैग के टाइप
TIFF में टाइप का बड़ा कड़ा हिसाब है। हर टैग सिर्फ़ यह नहीं बताता कि उसमें क्या है, बल्कि यह भी कि उसके बाइट को पढ़ा कैसे जाए। इसीलिए TIFF सही से पढ़ने के लिए इसका टाइप सिस्टम समझना ज़रूरी है।
| ID | नाम | साइज़ | जानकारी |
|---|---|---|---|
| 1 | BYTE | 1 | अनसाइन्ड 8-बिट इंटीजर |
| 2 | ASCII | 1 | null पर ख़त्म होने वाली स्ट्रिंग (8-बिट) |
| 3 | SHORT | 2 | अनसाइन्ड 16-बिट इंटीजर |
| 4 | LONG | 4 | अनसाइन्ड 32-बिट इंटीजर |
| 5 | RATIONAL | 8 | दो LONG: अंश/हर |
| 6 | SBYTE | 1 | साइन्ड 8-बिट इंटीजर |
| 7 | UNDEFINED | 1 | कच्चे बाइट (बाइनरी डेटा) |
| 8 | SSHORT | 2 | साइन्ड 16-बिट इंटीजर |
| 9 | SLONG | 4 | साइन्ड 32-बिट इंटीजर |
| 10 | SRATIONAL | 8 | दो SLONG: साइन्ड अंश/हर |
| 11 | FLOAT | 4 | IEEE 32-बिट फ़्लोट |
| 12 | DOUBLE | 8 | IEEE 64-बिट डबल |
| 13 | IFD | 4 | अंदर के IFD का pointer |
वैल्यू रखने का नियम
अगर size × count ≤ 4 बाइट हो, तो वैल्यू सीधे 4 बाइट वाले value फ़ील्ड में रख दी जाती है। वरना उस फ़ील्ड में वह offset रहता है जो बताता है कि डेटा फ़ाइल में कहाँ रखा है।
IFD के offset का हिसाब
TIFF पढ़ने में सबसे मुश्किल काम है offset की कड़ी के पीछे-पीछे चलना। सब कुछ फ़ाइल की शुरुआत से नापा जाता है, और आपको फ़ाइल में इधर-उधर ख़ूब कूदना पड़ता है। गणित कुछ यूँ चलता है:
IFD0_offset = bytes[4:8] // TIFF हेडर से
next_IFD = IFD0_offset + 2 + (entry_count × 12) + 4
subIFD_offset = tag_value // pointer टैग से (0x8769, 0x8825)
अहम टैग
इमेज डेटा वाले टैग (बचाए जाते हैं)
0x0100:ImageWidth0x0101:ImageLength0x0102:BitsPerSample0x0103:Compression0x0111:StripOffsets0x0117:StripByteCountsमेटाडेटा वाले टैग (हटाए जाते हैं)
0x010F:Make (कैमरा बनाने वाली कंपनी)0x0110:Model (कैमरे का मॉडल)0x0132:DateTime0x013B:Artist0x8298:Copyright0x9003:DateTimeOriginalpointer टैग (Sub-IFD)
0x8769:ExifIFDPointer0x8825:GPSInfoIFDPointer0xA005:InteroperabilityIFDPointerSubIFD
मुख्य IFD (IFD0) में अक्सर "pointer टैग" होते हैं, जो sub-directory की ओर इशारा करते हैं। इसी तरह EXIF, GPS और बाकी मेटाडेटा अलग-अलग तार्किक समूहों में बँट जाता है और मुख्य IFD साफ़-सुथरा बना रहता है।
EXIF SubIFD
इसमें कैमरे का मेटाडेटा रहता है: एक्सपोज़र, अपर्चर, ISO, फ़ोकल लेंथ, फ़्लैश, व्हाइट बैलेंस वग़ैरह।
GPS SubIFD
इसमें लोकेशन का डेटा रहता है: अक्षांश, देशांतर, ऊँचाई, समय, सैटेलाइट, रफ़्तार, दिशा। प्राइवेसी की बड़ी चिंता।
Maker Notes
कैमरा कंपनी का अपना डेटा। हर कंपनी का फ़ॉर्मैट अलग होता है। इसमें सीरियल नंबर, फ़र्मवेयर वर्ज़न और कस्टम सेटिंग हो सकती हैं।
PicScrub, TIFF को कैसे प्रोसेस करता है
हेडर पढ़ना
बाइट ऑर्डर (II/MM) तय करना और पहला IFD ढूँढना
टैग की whitelist बनाना
इमेज दिखाने के लिए ज़रूरी टैग पहचानना
IFD एंट्री छाँटना
मेटाडेटा वाले टैग हटाना, SubIFD के pointer शून्य करना
फ़ाइल दोबारा लिखना
साफ़ IFD और कॉपी किए हुए इमेज डेटा के साथ TIFF दोबारा बनाना
offset दोबारा निकालना
TIFF फ़ाइलें offset पर बहुत निर्भर रहती हैं। मेटाडेटा हटाने के बाद PicScrub को सारे offset दोबारा निकालने पड़ते हैं, ताकि फ़ाइल सही-सलामत रहे।