PNG फ़ॉर्मैट
Portable Network Graphics
chunk पर टिका स्ट्रक्चर
PNG का फ़ाइल फ़ॉर्मैट सबसे साफ़-सुथरे फ़ॉर्मैट में से एक है। सब कुछ "chunk" में बँटा होता है, यानी अपने आप में पूरे ब्लॉक, जिनका अपना टाइप, डेटा और चेकसम होता है। ख़ूबसूरत बात यह है कि जो chunk डिकोडर को समझ नहीं आते, वह उन्हें छोड़ सकता है, और इसी वजह से PNG पुराने सॉफ़्टवेयर को तोड़े बिना मेटाडेटा रख पाता है।
असली चतुराई chunk के नाम रखने में है: अगर पहला अक्षर कैपिटल है, तो वह "critical" है (उसके बिना इमेज दिखेगी ही नहीं)। छोटा अक्षर मतलब "ancillary", यानी हो तो अच्छा, पर ज़रूरी नहीं। मेटाडेटा वाले जितने chunk से हमें मतलब है, वे सब ancillary हैं, इसीलिए हम उन्हें बेफ़िक्र होकर हटा सकते हैं।
PNG फ़ाइल का स्ट्रक्चर
PNG सिग्नेचर और IHDR
| Offset | Hex | ASCII | |||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0000 | 89504E470D0A1A0A0000000D49484452 | .PNG........IHDR | |||||||||||||||
| 0010 | 00000100000001000802000000000000 | ............. | |||||||||||||||
chunk का स्ट्रक्चर
chunk के नाम रखने का नियम
- • पहला अक्षर कैपिटल = critical chunk (समझना ज़रूरी है)
- • पहला अक्षर छोटा = ancillary chunk (ज़रूरी नहीं, छोड़ा जा सकता है)
- • दूसरा अक्षर = पब्लिक (कैपिटल) या प्राइवेट (छोटा)
critical chunk
इमेज के सही होने के लिए इन chunk का मौजूद होना और समझा जाना ज़रूरी है। PicScrub critical chunk को हमेशा बचाकर रखता है।
IHDR:इमेज हेडर
सिग्नेचर के बाद पहला chunk। इसमें चौड़ाई, ऊँचाई, बिट डेप्थ, कलर टाइप, कंप्रेशन मेथड, फ़िल्टर मेथड और इंटरलेस मेथड होते हैं। डेटा ठीक 13 बाइट का होता है।
IDAT:इमेज डेटा
इसमें कंप्रेस किया हुआ (zlib/deflate) इमेज डेटा रहता है। यह कई IDAT chunk में बँट सकता है। सभी IDAT chunk एक के बाद एक होने चाहिए।
IEND:इमेज का अंत
यह PNG डेटास्ट्रीम के ख़त्म होने का निशान है। यह आख़िरी chunk होना चाहिए। इसमें डेटा के शून्य बाइट होते हैं।
PLTE:पैलेट
इंडेक्स्ड कलर इमेज (कलर टाइप 3) के लिए ज़रूरी। इसमें 1 से 256 तक RGB पैलेट एंट्री होती हैं।
मेटाडेटा वाले chunk
ये ancillary chunk हैं, जिनमें प्राइवेसी के लिहाज़ से संवेदनशील मेटाडेटा हो सकता है। PicScrub इन्हीं chunk को हटाता है।
tEXt:बिना कंप्रेस किया टेक्स्ट
Latin-1 एन्कोडिंग में key-value जोड़े। आम keys: Author, Description, Copyright, Creation Time, Software.
zTXt:कंप्रेस किया टेक्स्ट
tEXt जैसा ही, बस zlib कंप्रेशन के साथ। लंबे टेक्स्ट के लिए इस्तेमाल होता है।
iTXt:अंतरराष्ट्रीय टेक्स्ट
UTF-8 टेक्स्ट, कंप्रेशन के साथ भी और बिना भी। इसमें भाषा के टैग और अनूदित keyword रखे जा सकते हैं। XMP मेटाडेटा इसी में आता है।
XML:com.adobe.xmp\0eXIf:EXIF डेटा
2017 में PNG के एक्सटेंशन के तौर पर दर्ज हुआ। इसमें TIFF फ़ॉर्मैट में कच्चा EXIF डेटा रहता है, ठीक वैसा ही जैसा JPEG के EXIF में होता है। इसमें GPS, तारीख़ और समय, डिवाइस की जानकारी हो सकती है।
iCCP:ICC कलर प्रोफ़ाइल
फ़ाइल में जुड़ी ICC कलर प्रोफ़ाइल, zlib से कंप्रेस की हुई। रंग सही दिखें, इसलिए PicScrub इसे डिफ़ॉल्ट रूप से रहने देता है।
tIME:आख़िरी बदलाव का समय
सात बाइट: साल (2), महीना, दिन, घंटा, मिनट, सेकंड। इससे पता चलता है कि इमेज में आख़िरी बार कब बदलाव हुआ।
रंग से जुड़े chunk
ये chunk रंग दिखने के तरीके पर असर डालते हैं, पर आम तौर पर इनमें कोई निजी जानकारी नहीं होती। PicScrub इन्हें डिफ़ॉल्ट रूप से रहने देता है।
sRGB
बताता है कि कलर स्पेस sRGB है। रेंडरिंग इंटेंट के लिए एक बाइट।
gAMA
गामा वैल्यू, 4 बाइट के अनसाइन्ड इंटीजर के रूप में (1,00,000 से गुणा करके)।
cHRM
प्राइमरी क्रोमैटिसिटी और व्हाइट पॉइंट के कोऑर्डिनेट।
sBIT
हर चैनल की ओरिजिनल सैंपल बिट डेप्थ।
CRC32 की जाँच
हर PNG chunk के साथ एक CRC32 चेकसम रहता है, जो chunk के टाइप और डेटा पर निकाला जाता है। इससे डेटा की सलामती पक्की होती है।
CRC कैसे निकलता है
CRC32 input = chunk_type (4 bytes) + chunk_data (N bytes) CRC32 output = 4 bytes appended after chunk data // PNG इस CRC-32 पॉलिनोमियल का इस्तेमाल करता है: 0xEDB88320
PicScrub, CRC क्यों जाँचता है
PNG फ़ाइल पढ़ते समय PicScrub हर chunk का CRC जाँचता है, ताकि डेटा सही-सलामत रहे। ख़राब chunk को वह संभालकर निपटा देता है।
PicScrub, PNG को कैसे प्रोसेस करता है
सिग्नेचर जाँचना
PNG सिग्नेचर देखना: 89 50 4E 47 0D 0A 1A 0A
chunk पढ़ना
हर chunk की लंबाई और टाइप पढ़ना, और CRC जाँचना
मेटाडेटा वाले chunk छाँटना
tEXt, zTXt, iTXt, eXIf, tIME chunk पहचानकर छोड़ देना
फ़ाइल दोबारा बनाना
सिग्नेचर + छाँटे हुए chunk + IEND लिखना
जो chunk बचे रहते हैं
- • IHDR, PLTE, IDAT, IEND (critical)
- • sRGB, gAMA, cHRM (रंग)
- • iCCP (कलर प्रोफ़ाइल, आपकी मर्ज़ी)
- • pHYs (पिक्सल के डाइमेंशन)
- • tRNS (पारदर्शिता)
जो chunk हट जाते हैं
- • tEXt (टेक्स्ट मेटाडेटा)
- • zTXt (कंप्रेस किया टेक्स्ट)
- • iTXt (अंतरराष्ट्रीय टेक्स्ट, XMP)
- • eXIf (EXIF डेटा)
- • tIME (बदलाव का समय)