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

HEIC फ़ॉर्मैट

High Efficiency Image Container

ISOBMFF कंटेनर

अगर आपने कभी MP4 वीडियो फ़ाइलों के साथ काम किया है, तो HEIC आपको जाना-पहचाना लगेगा। Apple ने HEIC के कंटेनर के लिए ISO Base Media File Format (ISOBMFF) चुना, यानी इसका नाता JPEG या PNG जैसे पारंपरिक इमेज फ़ॉर्मैट से नहीं, बल्कि वीडियो फ़ॉर्मैट से है।

यह फ़ॉर्मैट एक-दूसरे के अंदर बैठे "box" से बना है (इन्हें atom भी कहते हैं), जिनके टाइप कोड 4 अक्षर के होते हैं। डिज़ाइन हैरान करने की हद तक सुथरा है, जो डेटा के जटिल ढाँचे संभाल लेता है और बुनियादी बातें समझ लेने के बाद पढ़ने में भी आसान रहता है।

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

ftyp
meta
mdat
ftyp
24 बाइट
फ़ाइल का टाइप और ब्रांड
meta
1000 बाइट
मेटाडेटा का कंटेनर
mdat
लंबाई बदलती रहती है
मीडिया डेटा (HEVC)

HEIC हेडर (ftyp box)

box का साइज़ (24)
box का टाइप (ftyp)
मुख्य ब्रांड (heic)
माइनर वर्ज़न
संगत ब्रांड (mif1)
संगत ब्रांड (heic)
OffsetHexASCII
0000
000000186674797068656963
....ftypheic
000C
000000006D69663168656963
....mif1heic

box का स्ट्रक्चर

SizeTypeData
4 बाइट (BE)4 बाइटSize - 8

अगर size = 1 हो, तो टाइप के बाद 8 बाइट का बढ़ा हुआ size आता है। अगर size = 0 हो, तो box फ़ाइल के आख़िर तक चलता है।

अहम box

HEIC फ़ाइलों में box का ढाँचा काफ़ी गहरा जा सकता है। JPEG में मेटाडेटा अंदाज़े लगाने लायक offset पर बैठा रहता है, पर HEIC अपना मेटाडेटा कई परतों के अंदर दबाकर रखता है। मुख्य हिस्से यूँ जुड़ते हैं:

ftyp:फ़ाइल का टाइप

फ़ाइल का पहला box। इसमें मुख्य ब्रांड और संगत ब्रांड रहते हैं। फ़ॉर्मैट पहचानने के लिए ज़रूरी है।

संगत ब्रांड: heic heix hevc hevx heim heis hevm hevs mif1 msf1

meta:मेटाडेटा का कंटेनर

इसमें सारा मेटाडेटा रहता है, जिसमें 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][GPS Data: 37.7749, -122.4194][Camera: iPhone]
बाद में: [Exif][0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00...]

शून्य ही क्यों लिखते हैं?

  • • फ़ाइल सही-सलामत रहती है:सारे offset वैध बने रहते हैं
  • • दोबारा कंप्रेशन नहीं:इमेज डेटा अछूता रहता है
  • • मेटाडेटा मिट जाता है:शून्य में कोई जानकारी नहीं होती
  • • क्या वापस पाया जा सकता है?:नहीं, ऊपर लिखा गया डेटा गया सो गया

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

1

box का स्ट्रक्चर पढ़ना

ftyp, meta को परत-दर-परत पढ़ना और सारे box पहचानना

2

मेटाडेटा ढूँढना

ipco कंटेनर में Exif और XMP प्रॉपर्टी ढूँढना

3

मेटाडेटा पर शून्य लिखना

मेटाडेटा वाले box के अंदर के डेटा पर शून्य लिख देना

4

स्ट्रक्चर बचाए रखना

box की हेडर, साइज़ और सारे offset जस के तस रखना

फ़ाइल के साइज़ की बात

चूँकि PicScrub मेटाडेटा हटाने के बजाय उस पर शून्य लिखता है, आउटपुट फ़ाइल का साइज़ इनपुट जितना ही रहेगा। मेटाडेटा की जगह बनी रहती है, बस उसमें शून्य भर जाते हैं।

इनपुट: 2.5 MB (जिसमें 50KB EXIF)
आउटपुट: 2.5 MB (50KB शून्य)

HEIC बनाम HEIF बनाम AVIF

नाम उलझाने वाले हैं, तो बात साफ़ कर लेते हैं। HEIF कंटेनर फ़ॉर्मैट है, जबकि HEIC और AVIF यह बताते हैं कि उस कंटेनर के अंदर इमेज को कंप्रेस करने के लिए कौन सा कोडेक इस्तेमाल हुआ है।

फ़ॉर्मैटकंटेनरकोडेककहाँ इस्तेमाल होता है
HEICHEIFHEVC (H.265)Apple के डिवाइस
HEIFHEIFकई तरह केआम कंटेनर
AVIFHEIFAV1वेब (रॉयल्टी-फ़्री)

तीनों एक ही ISOBMFF/HEIF कंटेनर स्ट्रक्चर पर चलते हैं, इसलिए PicScrub का तरीका तीनों पर काम करता है।