JPEG
सबसे ज़्यादा लीक करता हैJPEG फ़ाइल अपना मेटाडेटा APPn सेगमेंट में रखती है, फ़ाइल की हेडर और इमेज डेटा के बीच। यहाँ देखिए कहाँ क्या रहता है, और PicScrub हर हिस्से के साथ क्या करता है।
क्या हटाया जाता है
- EXIF GPS कोऑर्डिनेट, कैमरे का मेक और मॉडल, तारीख़ और समय, एक्सपोज़र सेटिंग्स
- XMP एडिटिंग हिस्ट्री, कौन सा सॉफ़्टवेयर इस्तेमाल हुआ, रेटिंग
- IPTC / Photoshop कैप्शन, क्रेडिट, कीवर्ड
- कमेंट और अंदर छिपे थंबनेल ओरिजिनल की एक नन्ही कॉपी, जो आपकी क्रॉपिंग और एडिटिंग के बाद भी बची रह सकती है
क्या आप रख सकते हैं
- इमेज डेटा हमेशा अछूता, कभी दोबारा एन्कोड नहीं होता
- ICC कलर प्रोफ़ाइल आपकी मर्ज़ी, ताकि रंग सही दिखें
- ओरिएंटेशन आपकी मर्ज़ी, ताकि पोर्ट्रेट सीधे रहें
- कॉपीराइट नोटिस आपकी मर्ज़ी, उन फ़ोटोग्राफ़रों के लिए जिन्हें क्रेडिट चाहिए पर कोऑर्डिनेट नहीं
फ़ाइल स्ट्रक्चर पर एक नज़र
अगर आपने कभी हेक्स एडिटर में JPEG खोला हो, तो आपने देखा होगा कि यह मार्कर से अलग-अलग किए गए सेगमेंट से बना होता है। हर मार्कर 0xFF से शुरू होता है, और उसके बाद वाला बाइट बताता है कि सेगमेंट किस तरह का है। इसी डिज़ाइन की वजह से JPEG पढ़ना आसान रहता है: बस FF बाइट खोजिए और देखिए आगे क्या है।
प्राइवेसी के लिहाज़ से मज़ेदार बात यह है कि सारा मेटाडेटा (EXIF, GPS, तारीख़ और समय) इन्हीं सेगमेंट में रहता है, इमेज के असली डेटा से बिल्कुल अलग। इसीलिए हम पिक्सल को छुए बिना और कुछ भी दोबारा कंप्रेस किए बिना मेटाडेटा हटा पाते हैं।
JPEG फ़ाइल का स्ट्रक्चर
JPEG हेडर का एक नमूना
| Offset | Hex | ASCII | |||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0000 | FFD8FFE000104A464946000101000048 | ......JFIF.....H | |||||||||||||||
| 0010 | 00480000FFE112344578696600000000 | .H.....4Exif.. | |||||||||||||||
मार्कर का स्ट्रक्चर
FF xx:मार्कर (xx बताता है कि किस तरह का है)LL LL:लंबाई (2 बाइट, big-endian, ख़ुद को भी गिनती है)Data...:सेगमेंट का डेटा (लंबाई - 2 बाइट)
JPEG मार्कर की पूरी सूची
| मार्कर | नाम | जानकारी |
|---|---|---|
| FF D8 | SOI | इमेज की शुरुआत |
| FF D9 | EOI | इमेज का अंत |
| FF C0 | SOF0 | फ़्रेम की शुरुआत (बेसलाइन DCT) |
| FF C2 | SOF2 | फ़्रेम की शुरुआत (प्रोग्रेसिव DCT) |
| FF C4 | DHT | हफ़मैन टेबल तय करना |
| FF DB | DQT | क्वांटाइज़ेशन टेबल तय करना |
| FF DD | DRI | रीस्टार्ट इंटरवल तय करना |
| FF DA | SOS | स्कैन की शुरुआत (इसके आगे इमेज डेटा है) |
| FF FE | COM | कमेंट (मेटाडेटा) |
| FF E0 | APP0 | JFIF मार्कर |
| FF E1 | APP1 | EXIF / XMP मार्कर |
| FF E2 | APP2 | ICC प्रोफ़ाइल / MPF |
| FF ED | APP13 | IPTC / Photoshop |
| FF EE | APP14 | Adobe कलर ट्रांसफ़ॉर्म |
सुनहरा = मेटाडेटा (हटाया जाता है), सादा = स्ट्रक्चर जो बना रहता है
JFIF बनाम EXIF
एक बात जो बहुत लोगों को उलझाती है: JPEG फ़ाइलों में अक्सर एक साथ दो अलग मेटाडेटा स्टैंडर्ड होते हैं। JFIF पहले आया और रेज़ोल्यूशन जैसी बुनियादी चीज़ें संभालता है। फिर कैमरों ने शूटिंग की पूरी जानकारी के साथ EXIF डेटा जोड़ना शुरू कर दिया। आज के ज़्यादातर JPEG में दोनों होते हैं, इसीलिए फ़ाइल की शुरुआत में आपको APP0 और APP1, दोनों मार्कर दिखते हैं।
APP0:JFIF
JPEG File Interchange Format. इमेज की बुनियादी जानकारी।
- • वर्ज़न नंबर
- • पिक्सल डेंसिटी (DPI)
- • आस्पेक्ट रेशियो
- • थंबनेल (ज़रूरी नहीं)
APP1:EXIF
Exchangeable Image File Format. कैमरे का मेटाडेटा।
- • कैमरे का मेक/मॉडल
- • GPS कोऑर्डिनेट
- • तारीख़ और समय
- • एक्सपोज़र सेटिंग्स
APP मार्कर की गहराई में
JPEG के स्पेक ने 16 "एप्लिकेशन" मार्कर (APP0 से APP15 तक) कंपनियों के लिए छोड़ रखे थे कि वे जैसे चाहें इस्तेमाल करें। सालों में अलग-अलग संस्थाओं ने अपने मेटाडेटा फ़ॉर्मैट के लिए अलग-अलग मार्कर हथिया लिए। नतीजा थोड़ा बिखरा हुआ है, पर कम से कम अच्छे से दर्ज है।
पेच यह है कि एक ही मार्कर, कंटेंट के हिसाब से अलग-अलग चीज़ का मतलब रख सकता है। मसलन APP1 में या तो EXIF हो सकता है या XMP, इसलिए यह जानने के लिए कि आपके सामने क्या है, अंदर की आइडेंटिफ़ायर स्ट्रिंग देखनी पड़ती है।
APP0 (0xFFE0):JFIF
आइडेंटिफ़ायर: JFIF\0. इसमें वर्ज़न, डेंसिटी की इकाई, X/Y डेंसिटी और कभी-कभी थंबनेल होता है। आम तौर पर इसे रहने देना सुरक्षित है।
APP1 (0xFFE1):EXIF
आइडेंटिफ़ायर: Exif\0\0. इसमें एक पूरा TIFF स्ट्रक्चर होता है, जिसकी IFD एंट्री में कैमरे की जानकारी, GPS डेटा, तारीख़ और समय, थंबनेल और Maker Notes रहते हैं। प्राइवेसी की सबसे बड़ी चिंता।
APP1 (0xFFE1):XMP
आइडेंटिफ़ायर: http://ns.adobe.com/xap/1.0/\0. Adobe का बनाया XML-आधारित मेटाडेटा स्टैंडर्ड। इसमें एडिटिंग हिस्ट्री, सॉफ़्टवेयर की जानकारी और बढ़ा हुआ EXIF डेटा हो सकता है।
XMP namespace
xmp: http://ns.adobe.com/xap/1.0/xmpMM: http://ns.adobe.com/xap/1.0/mm/dc: http://purl.org/dc/elements/1.1/photoshop: http://ns.adobe.com/photoshop/1.0/tiff: http://ns.adobe.com/tiff/1.0/exif: http://ns.adobe.com/exif/1.0/APP1 (0xFFE1):Extended XMP
आइडेंटिफ़ायर: http://ns.adobe.com/xmp/extension/\0. 65KB से बड़े XMP डेटा के लिए, जो कई APP1 सेगमेंट में बँट जाता है।
APP2 (0xFFE2):MPF
आइडेंटिफ़ायर: MPF\0. स्टीरियोस्कोपिक इमेज और पैनोरमा के लिए Multi-Picture Format.
APP2 (0xFFE2):ICC प्रोफ़ाइल
आइडेंटिफ़ायर: ICC_PROFILE\0. कलर मैनेजमेंट का डेटा। यह कई APP2 मार्कर में टुकड़ों में बँट सकता है। इसे रहने देना आम तौर पर सुरक्षित है।
APP13 (0xFFED):IPTC/Photoshop
आइडेंटिफ़ायर: Photoshop 3.0\0. इसमें IPTC-IIM डेटा रहता है, यानी कैप्शन, कीवर्ड, कॉपीराइट और बनाने वाले की जानकारी। इसमें लेखक की जानकारी हो सकती है।
APP14 (0xFFEE):Adobe
आइडेंटिफ़ायर: Adobe\0. इसमें कलर ट्रांसफ़ॉर्म के फ़्लैग (RGB/CMYK) होते हैं। रंग सही दिखने के लिए ज़रूरी है।
EXIF का स्ट्रक्चर
अब बात दिलचस्प (और थोड़ी अजीब) हो जाती है। EXIF डेटा असल में एक छोटी सी TIFF फ़ाइल है, जो आपके JPEG के अंदर बैठी होती है। जी हाँ, सच में। उसकी अपनी हेडर है, अपना बाइट ऑर्डर है, और टैग रखने के लिए वह TIFF का IFD (Image File Directory) स्ट्रक्चर इस्तेमाल करती है।
"Exif" आइडेंटिफ़ायर के बाद सबसे पहले एक TIFF हेडर मिलती है, जो बताती है कि डेटा little-endian (Intel, "II") है या big-endian (Motorola, "MM")। यहाँ चूक हुई तो सारे नंबर कचरा हो जाएँगे, इसलिए हर पार्सर सबसे पहले यही देखता है।
TIFF हेडर (8 बाइट)
| Offset | Hex | ASCII | |||||||
|---|---|---|---|---|---|---|---|---|---|
| 0000 | 49492A0008000000 | II*..... | |||||||
II = Intel (little-endian), MM = Motorola (big-endian)
IFD एंट्री का स्ट्रक्चर (12 बाइट)
अहम IFD एंट्री
0x010F:Make0x0110:Model0x0132:DateTime0x8769:ExifIFDPointer0x8825:GPSInfoIFDPointer0x927C:MakerNotePicScrub, JPEG को कैसे प्रोसेस करता है
तरीका काफ़ी सीधा है: हम फ़ाइल को एक-एक मार्कर करके पढ़ते हैं, जो सेगमेंट इमेज दिखाने के लिए ज़रूरी हैं उन्हें रख लेते हैं, और जिनमें मेटाडेटा है उन्हें छोड़ देते हैं। चूँकि कंप्रेस किए हुए इमेज डेटा को हम छूते ही नहीं, क्वालिटी में ज़रा भी फ़र्क़ नहीं पड़ता।
असली बात यह है कि JPEG का मार्कर वाला स्ट्रक्चर यह काम आसान कर देता है। हमें न DCT कोएफ़िशिएंट समझने की ज़रूरत है, न हफ़मैन टेबल की। बस इतना पहचानना है कि कौन सा सेगमेंट मेटाडेटा है और कौन सा नहीं।
हेडर की जाँच
फ़ाइल की शुरुआत में SOI मार्कर (FF D8) है या नहीं, यह देखना
मार्कर पढ़ना
एक-एक करके हर मार्कर पढ़ना और उसका प्रकार व लंबाई निकालना
मेटाडेटा पहचानना
APP सेगमेंट में आइडेंटिफ़ायर देखना (EXIF, XMP, IPTC वग़ैरह)
चुन-चुनकर कॉपी करना
मेटाडेटा वाले सेगमेंट छोड़कर बाकी सब आउटपुट में कॉपी करना
क्या बचा रहता है
- • SOI/EOI मार्कर (ज़रूरी हैं)
- • DQT (क्वांटाइज़ेशन टेबल)
- • SOF (फ़्रेम हेडर)
- • DHT (हफ़मैन टेबल)
- • SOS और स्कैन डेटा (असली इमेज)
- • आपकी मर्ज़ी: ICC कलर प्रोफ़ाइल
क्या हट जाता है
- • APP1 EXIF (कैमरा, GPS, तारीख़ और समय)
- • APP1 XMP (एडिटिंग का मेटाडेटा)
- • APP13 IPTC (कैप्शन, लेखक)
- • COM मार्कर (कमेंट)
- • EXIF वाली थंबनेल इमेज
EXIF टैग की सूची
प्राइवेसी के मामले में सारे EXIF टैग एक जैसे नहीं होते। एक्सपोज़र सेटिंग जैसे कुछ टैग बिल्कुल हानिरहित हैं। वहीं सीरियल नंबर और मालिक के नाम जैसे टैग आपकी या आपके उपकरण की पहचान करा सकते हैं। जिन्हें हम ज़्यादा जोखिम वाला मानते हैं, वे ये हैं:
| Tag ID | नाम | प्राइवेसी का जोखिम |
|---|---|---|
| 0x9003 | DateTimeOriginal | ज़्यादा |
| 0x9004 | DateTimeDigitized | ज़्यादा |
| 0x9010 | OffsetTime | मध्यम |
| 0x9286 | UserComment | ज़्यादा |
| 0x927C | MakerNote | ज़्यादा |
| 0xA420 | ImageUniqueID | ज़्यादा |
| 0xA430 | CameraOwnerName | ज़्यादा |
| 0xA431 | BodySerialNumber | ज़्यादा |
| 0xA434 | LensModel | मध्यम |
| 0xA435 | LensSerialNumber | ज़्यादा |
| 0xFDE8 | OwnerName | ज़्यादा |
| 0xFDE9 | SerialNumber | ज़्यादा |
कैमरा सेटिंग वाले सभी टैग देखें (जिनसे पहचान नहीं होती)
0x829A ExposureTime0x829D FNumber0x8822 ExposureProgram0x8827 ISOSpeedRatings0x9201 ShutterSpeedValue0x9202 ApertureValue0x9203 BrightnessValue0x9204 ExposureBiasValue0x9207 MeteringMode0x9208 LightSource0x9209 Flash0x920A FocalLength0xA001 ColorSpace0xA002 PixelXDimension0xA003 PixelYDimension0xA402 ExposureMode0xA403 WhiteBalance0xA405 FocalLengthIn35mmFilm0xA406 SceneCaptureTypeGPS टैग की सूची
GPS डेटा अपने अलग sub-IFD में रहता है, जिसका पता मुख्य IFD के टैग 0x8825 से चलता है। अगर वह pointer मौजूद है, तो समझिए आपकी इमेज में लोकेशन का डेटा है। आजकल के स्मार्टफ़ोन यह डेटा जोड़ने में ख़ास तौर पर आगे रहते हैं, और अक्सर इतनी सटीकता से कि आप ठीक कहाँ खड़े थे, यह भी पता चल जाए।
| Tag ID | नाम | जानकारी |
|---|---|---|
| 0x0000 | GPSVersionID | GPS टैग का वर्ज़न |
| 0x0001 | GPSLatitudeRef | N या S |
| 0x0002 | GPSLatitude | डिग्री, मिनट, सेकंड |
| 0x0003 | GPSLongitudeRef | E या W |
| 0x0004 | GPSLongitude | डिग्री, मिनट, सेकंड |
| 0x0005 | GPSAltitudeRef | समुद्र तल से ऊपर या नीचे |
| 0x0006 | GPSAltitude | मीटर में |
| 0x0007 | GPSTimeStamp | UTC समय |
| 0x001D | GPSDateStamp | UTC तारीख़ |
| 0x0012 | GPSMapDatum | जियोडेटिक सर्वे का डेटा |
| 0x001B | GPSProcessingMethod | GPS/CELLID/WLAN/MANUAL |
| 0x001C | GPSAreaInformation | जगह का नाम |
IPTC टैग की सूची
IPTC न्यूज़ एजेंसियों के लिए बनाया गया था, ताकि वे कैप्शन, क्रेडिट और कॉपीराइट की जानकारी फ़ाइल में ही डाल सकें। यह APP13 के अंदर "Photoshop 3.0" आइडेंटिफ़ायर के साथ रहता है (जी हाँ, Adobe ने इसे अपना लिया)। अगर आपने कभी Lightroom या Photoshop में कॉपीराइट या कीवर्ड जोड़े हैं, तो वे यहीं पहुँचते हैं।
0x0250 By-line (लेखक)0x0255 By-line Title (पदनाम)0x025A City (शहर)0x025C Sub-location (इलाक़ा)0x025F Province/State (राज्य)0x0265 Country Name (देश)0x0274 Copyright Notice (कॉपीराइट)0x0276 Contact (संपर्क)0x0237 Date Created (कब बनी)0x023C Time Created (कितने बजे बनी)0x0278 Caption/Abstract (कैप्शन)0x0219 Keywords (कीवर्ड)