HEIC फ़ॉर्मैट
High Efficiency Image Container
ISOBMFF कंटेनर
अगर आपने कभी MP4 वीडियो फ़ाइलों के साथ काम किया है, तो HEIC आपको जाना-पहचाना लगेगा। Apple ने HEIC के कंटेनर के लिए ISO Base Media File Format (ISOBMFF) चुना, यानी इसका नाता JPEG या PNG जैसे पारंपरिक इमेज फ़ॉर्मैट से नहीं, बल्कि वीडियो फ़ॉर्मैट से है।
यह फ़ॉर्मैट एक-दूसरे के अंदर बैठे "box" से बना है (इन्हें atom भी कहते हैं), जिनके टाइप कोड 4 अक्षर के होते हैं। डिज़ाइन हैरान करने की हद तक सुथरा है, जो डेटा के जटिल ढाँचे संभाल लेता है और बुनियादी बातें समझ लेने के बाद पढ़ने में भी आसान रहता है।
HEIC फ़ाइल का स्ट्रक्चर
HEIC हेडर (ftyp box)
| Offset | Hex | ASCII | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0000 | 000000186674797068656963 | ....ftypheic | |||||||||||
| 000C | 000000006D69663168656963 | ....mif1heic | |||||||||||
box का स्ट्रक्चर
अगर size = 1 हो, तो टाइप के बाद 8 बाइट का बढ़ा हुआ size आता है। अगर size = 0 हो, तो box फ़ाइल के आख़िर तक चलता है।
अहम box
HEIC फ़ाइलों में box का ढाँचा काफ़ी गहरा जा सकता है। JPEG में मेटाडेटा अंदाज़े लगाने लायक offset पर बैठा रहता है, पर HEIC अपना मेटाडेटा कई परतों के अंदर दबाकर रखता है। मुख्य हिस्से यूँ जुड़ते हैं:
ftyp:फ़ाइल का टाइप
फ़ाइल का पहला box। इसमें मुख्य ब्रांड और संगत ब्रांड रहते हैं। फ़ॉर्मैट पहचानने के लिए ज़रूरी है।
heic heix hevc hevx heim heis hevm hevs mif1 msf1meta:मेटाडेटा का कंटेनर
इसमें सारा मेटाडेटा रहता है, जिसमें item की जगह, उनकी प्रॉपर्टी और आपसी जुड़ाव शामिल हैं। EXIF/XMP डेटा यहीं बसता है।
meta (मेटाडेटा का कंटेनर) ├── hdlr (handler का रेफ़रेंस) ├── pitm (मुख्य item का ID) ├── iloc (item की जगह → mdat में offset) │ └── [item_id, offset, length] एंट्री ├── iinf (item की जानकारी → 'Exif' item ढूँढना) │ └── टाइप के साथ infe एंट्री ├── iprp (item की प्रॉपर्टी) │ ├── ipco (प्रॉपर्टी का कंटेनर) │ │ ├── hvcC (HEVC डिकोडर का कॉन्फ़िग) │ │ ├── ispe (इमेज के डाइमेंशन) │ │ ├── colr (ICC प्रोफ़ाइल, offset+12) │ │ ├── Exif (TIFF फ़ॉर्मैट में EXIF) │ │ └── pixi (पिक्सल की जानकारी) │ └── ipma (प्रॉपर्टी का जुड़ाव) └── iref (item के रेफ़रेंस)
mdat:मीडिया डेटा
इसमें HEVC में एन्कोड किया असली इमेज डेटा रहता है। meta के अंदर वाला iloc box बताता है कि mdat में कहाँ-कहाँ क्या है।
HEIC में मेटाडेटा
अगर आप JPEG के APP मार्कर के आदी हैं, तो HEIC का तरीका अलग लगेगा। यहाँ फ़ाइल की शुरुआत में एक के बाद एक मार्कर नहीं होते, बल्कि मेटाडेटा meta box के अंदर "item property" के रूप में रहता है। असली EXIF डेटा तो उसी जाने-पहचाने TIFF फ़ॉर्मैट में ही होता है, बस उस तक पहुँचने के लिए पहले box का ढाँचा पार करना पड़ता है।
EXIF प्रॉपर्टी
ipco (item property container) में "Exif" टाइप के साथ रखी जाती है। इसमें TIFF फ़ॉर्मैट में मानक EXIF डेटा रहता है, ठीक JPEG जैसा।
XMP प्रॉपर्टी
XML पर बना मेटाडेटा, जो "mime" टाइप की प्रॉपर्टी के रूप में रखा जाता है, जिसका content-type "application/rdf+xml" होता है।
ICC प्रोफ़ाइल
कलर प्रोफ़ाइल, "colr" box में "prof" टाइप के साथ रखी जाती है।
offset क्यों मायने रखते हैं
iloc box में mdat के अंदर की सटीक बाइट offset रहती हैं। अगर किसी box का साइज़ बदल जाए (जैसे मेटाडेटा हटाने से), तो ये offset दोबारा निकालने पड़ेंगे, वरना फ़ाइल पढ़ी ही नहीं जाएगी।
बिना कुछ बिगाड़े एनोनिमाइज़ेशन
HEIC में असली पेच यहीं है। यह फ़ॉर्मैट वीडियो और इमेज को कम जगह में रखने के लिए बना था, मेटाडेटा में आसानी से फेरबदल के लिए नहीं।
चुनौती क्या है
HEIC का offset पर टिका स्ट्रक्चर बाइट हटाने को जोखिम भरा बना देता है। iloc box में mdat के अंदर की सटीक बाइट offset रहती हैं। आपने एक भी box हटाया, तो वे offset ग़लत हो जाएँगे और इमेज खुलनी बंद हो जाएगी।
शून्य लिखने वाला तरीका
मेटाडेटा वाले box हटाने के बजाय PicScrub उनके अंदर के डेटा पर शून्य लिख देता है, और box का स्ट्रक्चर व साइज़ जस का तस रहने देता है।
बाद में: [Exif][0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00...]
शून्य ही क्यों लिखते हैं?
- • फ़ाइल सही-सलामत रहती है:सारे offset वैध बने रहते हैं
- • दोबारा कंप्रेशन नहीं:इमेज डेटा अछूता रहता है
- • मेटाडेटा मिट जाता है:शून्य में कोई जानकारी नहीं होती
- • क्या वापस पाया जा सकता है?:नहीं, ऊपर लिखा गया डेटा गया सो गया
PicScrub, HEIC को कैसे प्रोसेस करता है
box का स्ट्रक्चर पढ़ना
ftyp, meta को परत-दर-परत पढ़ना और सारे box पहचानना
मेटाडेटा ढूँढना
ipco कंटेनर में Exif और XMP प्रॉपर्टी ढूँढना
मेटाडेटा पर शून्य लिखना
मेटाडेटा वाले box के अंदर के डेटा पर शून्य लिख देना
स्ट्रक्चर बचाए रखना
box की हेडर, साइज़ और सारे offset जस के तस रखना
फ़ाइल के साइज़ की बात
चूँकि PicScrub मेटाडेटा हटाने के बजाय उस पर शून्य लिखता है, आउटपुट फ़ाइल का साइज़ इनपुट जितना ही रहेगा। मेटाडेटा की जगह बनी रहती है, बस उसमें शून्य भर जाते हैं।
HEIC बनाम HEIF बनाम AVIF
नाम उलझाने वाले हैं, तो बात साफ़ कर लेते हैं। HEIF कंटेनर फ़ॉर्मैट है, जबकि HEIC और AVIF यह बताते हैं कि उस कंटेनर के अंदर इमेज को कंप्रेस करने के लिए कौन सा कोडेक इस्तेमाल हुआ है।
| फ़ॉर्मैट | कंटेनर | कोडेक | कहाँ इस्तेमाल होता है |
|---|---|---|---|
| HEIC | HEIF | HEVC (H.265) | Apple के डिवाइस |
| HEIF | HEIF | कई तरह के | आम कंटेनर |
| AVIF | HEIF | AV1 | वेब (रॉयल्टी-फ़्री) |
तीनों एक ही ISOBMFF/HEIF कंटेनर स्ट्रक्चर पर चलते हैं, इसलिए PicScrub का तरीका तीनों पर काम करता है।