PicScrub logoPicScrub
फ़ॉर्मैट पर वापस जाएँ

TIFF फ़ॉर्मैट

Tagged Image File Format

हेडर का स्ट्रक्चर

इमेज मेटाडेटा का दादा कहिए TIFF को। JPEG में आप जो EXIF डेटा देखते हैं, वह असल में फ़ाइल के अंदर बैठा एक TIFF स्ट्रक्चर ही है। TIFF समझ लिया तो समझिए ज़्यादातर इमेज मेटाडेटा का चलन समझ लिया।

फ़ॉर्मैट की शुरुआत 8 बाइट की हेडर से होती है, जो दो अहम बातें बताती है: बाइट ऑर्डर (Intel या Motorola) और पहला IFD कहाँ मिलेगा। उसके आगे तो बस pointer के पीछे भागते रहना है।

TIFF फ़ाइल का स्ट्रक्चर

Header
IFD0
Strip Data
EXIF IFD
GPS IFD
Header
8 बाइट
बाइट ऑर्डर + मैजिक + IFD का offset
IFD0
200 बाइट
मुख्य इमेज डायरेक्टरी
Strip Data
लंबाई बदलती रहती है
इमेज के पिक्सल का डेटा
EXIF IFD
500 बाइट
EXIF की sub-directory
GPS IFD
100 बाइट
GPS की sub-directory

TIFF हेडर

बाइट ऑर्डर (II = Little Endian)
मैजिक नंबर (42)
पहले IFD का offset
OffsetHexASCII
0000
49492A0008000000
II*.....

बाइट ऑर्डर

49 49 (II)

Intel:little-endian (सबसे कम अहमियत वाला बाइट पहले)

4D 4D (MM)

Motorola:big-endian (सबसे ज़्यादा अहमियत वाला बाइट पहले)

IFD का स्ट्रक्चर

IFD का मतलब है Image File Directory, पर इसे विषय-सूची समझिए। यह टैग की एक सपाट सूची होती है, जिसका हर टैग किसी न किसी डेटा की ओर इशारा करता है। मज़े की बात यह है कि एक IFD दूसरे IFD की ओर भी इशारा कर सकता है, और यूँ एक पेड़ जैसा ढाँचा बन जाता है।

IFD की बनावट

2 बाइटएंट्री की गिनती (कितने टैग हैं)
12 × N बाइटटैग की एंट्री (हर एक 12 बाइट की)
4 बाइटअगले IFD का offset (न हो तो 0)

टैग एंट्री का स्ट्रक्चर (12 बाइट)

Tag IDTypeCountValue/Offset
2 बाइट2 बाइट4 बाइट4 बाइट

अगर डेटा 4 बाइट में समा जाए, तो वह सीधे value फ़ील्ड में ही रख दिया जाता है। वरना value फ़ील्ड में डेटा तक पहुँचने का offset रहता है।

टैग के टाइप

TIFF में टाइप का बड़ा कड़ा हिसाब है। हर टैग सिर्फ़ यह नहीं बताता कि उसमें क्या है, बल्कि यह भी कि उसके बाइट को पढ़ा कैसे जाए। इसीलिए TIFF सही से पढ़ने के लिए इसका टाइप सिस्टम समझना ज़रूरी है।

IDनामसाइज़जानकारी
1BYTE1अनसाइन्ड 8-बिट इंटीजर
2ASCII1null पर ख़त्म होने वाली स्ट्रिंग (8-बिट)
3SHORT2अनसाइन्ड 16-बिट इंटीजर
4LONG4अनसाइन्ड 32-बिट इंटीजर
5RATIONAL8दो LONG: अंश/हर
6SBYTE1साइन्ड 8-बिट इंटीजर
7UNDEFINED1कच्चे बाइट (बाइनरी डेटा)
8SSHORT2साइन्ड 16-बिट इंटीजर
9SLONG4साइन्ड 32-बिट इंटीजर
10SRATIONAL8दो SLONG: साइन्ड अंश/हर
11FLOAT4IEEE 32-बिट फ़्लोट
12DOUBLE8IEEE 64-बिट डबल
13IFD4अंदर के IFD का pointer

वैल्यू रखने का नियम

अगर size × count ≤ 4 बाइट हो, तो वैल्यू सीधे 4 बाइट वाले value फ़ील्ड में रख दी जाती है। वरना उस फ़ील्ड में वह offset रहता है जो बताता है कि डेटा फ़ाइल में कहाँ रखा है।

IFD के offset का हिसाब

TIFF पढ़ने में सबसे मुश्किल काम है offset की कड़ी के पीछे-पीछे चलना। सब कुछ फ़ाइल की शुरुआत से नापा जाता है, और आपको फ़ाइल में इधर-उधर ख़ूब कूदना पड़ता है। गणित कुछ यूँ चलता है:

// IFD0 कहाँ है
IFD0_offset = bytes[4:8] // TIFF हेडर से
// अगला IFD कहाँ है (जैसे थंबनेल के लिए IFD1)
next_IFD = IFD0_offset + 2 + (entry_count × 12) + 4
// SubIFD कहाँ है (EXIF, GPS)
subIFD_offset = tag_value // pointer टैग से (0x8769, 0x8825)

अहम टैग

इमेज डेटा वाले टैग (बचाए जाते हैं)

0x0100:ImageWidth
0x0101:ImageLength
0x0102:BitsPerSample
0x0103:Compression
0x0111:StripOffsets
0x0117:StripByteCounts

मेटाडेटा वाले टैग (हटाए जाते हैं)

0x010F:Make (कैमरा बनाने वाली कंपनी)
0x0110:Model (कैमरे का मॉडल)
0x0132:DateTime
0x013B:Artist
0x8298:Copyright
0x9003:DateTimeOriginal

pointer टैग (Sub-IFD)

0x8769:ExifIFDPointer
0x8825:GPSInfoIFDPointer
0xA005:InteroperabilityIFDPointer

SubIFD

मुख्य IFD (IFD0) में अक्सर "pointer टैग" होते हैं, जो sub-directory की ओर इशारा करते हैं। इसी तरह EXIF, GPS और बाकी मेटाडेटा अलग-अलग तार्किक समूहों में बँट जाता है और मुख्य IFD साफ़-सुथरा बना रहता है।

EXIF SubIFD

इसमें कैमरे का मेटाडेटा रहता है: एक्सपोज़र, अपर्चर, ISO, फ़ोकल लेंथ, फ़्लैश, व्हाइट बैलेंस वग़ैरह।

GPS SubIFD

इसमें लोकेशन का डेटा रहता है: अक्षांश, देशांतर, ऊँचाई, समय, सैटेलाइट, रफ़्तार, दिशा। प्राइवेसी की बड़ी चिंता।

Maker Notes

कैमरा कंपनी का अपना डेटा। हर कंपनी का फ़ॉर्मैट अलग होता है। इसमें सीरियल नंबर, फ़र्मवेयर वर्ज़न और कस्टम सेटिंग हो सकती हैं।

PicScrub, TIFF को कैसे प्रोसेस करता है

1

हेडर पढ़ना

बाइट ऑर्डर (II/MM) तय करना और पहला IFD ढूँढना

2

टैग की whitelist बनाना

इमेज दिखाने के लिए ज़रूरी टैग पहचानना

3

IFD एंट्री छाँटना

मेटाडेटा वाले टैग हटाना, SubIFD के pointer शून्य करना

4

फ़ाइल दोबारा लिखना

साफ़ IFD और कॉपी किए हुए इमेज डेटा के साथ TIFF दोबारा बनाना

offset दोबारा निकालना

TIFF फ़ाइलें offset पर बहुत निर्भर रहती हैं। मेटाडेटा हटाने के बाद PicScrub को सारे offset दोबारा निकालने पड़ते हैं, ताकि फ़ाइल सही-सलामत रहे।