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

JPEG

सबसे ज़्यादा लीक करता है

JPEG फ़ाइल अपना मेटाडेटा APPn सेगमेंट में रखती है, फ़ाइल की हेडर और इमेज डेटा के बीच। यहाँ देखिए कहाँ क्या रहता है, और PicScrub हर हिस्से के साथ क्या करता है।

कलर प्रोफ़ाइल, कहें तो रहने देंगे
SOIशुरू
APP0JFIF
APP1EXIF
APP1XMP
APP2ICC
APP13IPTC
COMकमेंट
SOS …आपकी असली फ़ोटो, बिल्कुल वैसी की वैसी
EOIअंत
GPS और कैमरा यहीं छिपे रहते हैं, हटा दिए
बाइट-दर-बाइट वही

क्या हटाया जाता है

  • EXIF GPS कोऑर्डिनेट, कैमरे का मेक और मॉडल, तारीख़ और समय, एक्सपोज़र सेटिंग्स
  • XMP एडिटिंग हिस्ट्री, कौन सा सॉफ़्टवेयर इस्तेमाल हुआ, रेटिंग
  • IPTC / Photoshop कैप्शन, क्रेडिट, कीवर्ड
  • कमेंट और अंदर छिपे थंबनेल ओरिजिनल की एक नन्ही कॉपी, जो आपकी क्रॉपिंग और एडिटिंग के बाद भी बची रह सकती है

क्या आप रख सकते हैं

  • इमेज डेटा हमेशा अछूता, कभी दोबारा एन्कोड नहीं होता
  • ICC कलर प्रोफ़ाइल आपकी मर्ज़ी, ताकि रंग सही दिखें
  • ओरिएंटेशन आपकी मर्ज़ी, ताकि पोर्ट्रेट सीधे रहें
  • कॉपीराइट नोटिस आपकी मर्ज़ी, उन फ़ोटोग्राफ़रों के लिए जिन्हें क्रेडिट चाहिए पर कोऑर्डिनेट नहीं

फ़ाइल स्ट्रक्चर पर एक नज़र

अगर आपने कभी हेक्स एडिटर में JPEG खोला हो, तो आपने देखा होगा कि यह मार्कर से अलग-अलग किए गए सेगमेंट से बना होता है। हर मार्कर 0xFF से शुरू होता है, और उसके बाद वाला बाइट बताता है कि सेगमेंट किस तरह का है। इसी डिज़ाइन की वजह से JPEG पढ़ना आसान रहता है: बस FF बाइट खोजिए और देखिए आगे क्या है।

प्राइवेसी के लिहाज़ से मज़ेदार बात यह है कि सारा मेटाडेटा (EXIF, GPS, तारीख़ और समय) इन्हीं सेगमेंट में रहता है, इमेज के असली डेटा से बिल्कुल अलग। इसीलिए हम पिक्सल को छुए बिना और कुछ भी दोबारा कंप्रेस किए बिना मेटाडेटा हटा पाते हैं।

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

SOI
APP0-15
DQT
SOF
DHT
SOS + Data
EOI
SOI
2 बाइट
इमेज की शुरुआत (FF D8)
APP0-15
100 बाइट
एप्लिकेशन मार्कर (मेटाडेटा)
DQT
130 बाइट
क्वांटाइज़ेशन टेबल
SOF
20 बाइट
फ़्रेम की शुरुआत
DHT
420 बाइट
हफ़मैन टेबल
SOS + Data
लंबाई बदलती रहती है
स्कैन डेटा (यानी इमेज)
EOI
2 बाइट
इमेज का अंत (FF D9)

JPEG हेडर का एक नमूना

SOI (इमेज की शुरुआत)
APP0 मार्कर
APP0 की लंबाई
JFIF आइडेंटिफ़ायर
JFIF डेटा
APP1 मार्कर
APP1 की लंबाई
Exif आइडेंटिफ़ायर
OffsetHexASCII
0000
FFD8FFE000104A464946000101000048
......JFIF.....H
0010
00480000FFE112344578696600000000
.H.....4Exif..

मार्कर का स्ट्रक्चर

  • FF xx:मार्कर (xx बताता है कि किस तरह का है)
  • LL LL:लंबाई (2 बाइट, big-endian, ख़ुद को भी गिनती है)
  • Data...:सेगमेंट का डेटा (लंबाई - 2 बाइट)

JPEG मार्कर की पूरी सूची

मार्करनामजानकारी
FF D8SOIइमेज की शुरुआत
FF D9EOIइमेज का अंत
FF C0SOF0फ़्रेम की शुरुआत (बेसलाइन DCT)
FF C2SOF2फ़्रेम की शुरुआत (प्रोग्रेसिव DCT)
FF C4DHTहफ़मैन टेबल तय करना
FF DBDQTक्वांटाइज़ेशन टेबल तय करना
FF DDDRIरीस्टार्ट इंटरवल तय करना
FF DASOSस्कैन की शुरुआत (इसके आगे इमेज डेटा है)
FF FECOMकमेंट (मेटाडेटा)
FF E0APP0JFIF मार्कर
FF E1APP1EXIF / XMP मार्कर
FF E2APP2ICC प्रोफ़ाइल / MPF
FF EDAPP13IPTC / Photoshop
FF EEAPP14Adobe कलर ट्रांसफ़ॉर्म

सुनहरा = मेटाडेटा (हटाया जाता है), सादा = स्ट्रक्चर जो बना रहता है

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 बाइट)

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

II = Intel (little-endian), MM = Motorola (big-endian)

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

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

अहम IFD एंट्री

0x010F:Make
0x0110:Model
0x0132:DateTime
0x8769:ExifIFDPointer
0x8825:GPSInfoIFDPointer
0x927C:MakerNote

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

तरीका काफ़ी सीधा है: हम फ़ाइल को एक-एक मार्कर करके पढ़ते हैं, जो सेगमेंट इमेज दिखाने के लिए ज़रूरी हैं उन्हें रख लेते हैं, और जिनमें मेटाडेटा है उन्हें छोड़ देते हैं। चूँकि कंप्रेस किए हुए इमेज डेटा को हम छूते ही नहीं, क्वालिटी में ज़रा भी फ़र्क़ नहीं पड़ता।

असली बात यह है कि JPEG का मार्कर वाला स्ट्रक्चर यह काम आसान कर देता है। हमें न DCT कोएफ़िशिएंट समझने की ज़रूरत है, न हफ़मैन टेबल की। बस इतना पहचानना है कि कौन सा सेगमेंट मेटाडेटा है और कौन सा नहीं।

1

हेडर की जाँच

फ़ाइल की शुरुआत में SOI मार्कर (FF D8) है या नहीं, यह देखना

2

मार्कर पढ़ना

एक-एक करके हर मार्कर पढ़ना और उसका प्रकार व लंबाई निकालना

3

मेटाडेटा पहचानना

APP सेगमेंट में आइडेंटिफ़ायर देखना (EXIF, XMP, IPTC वग़ैरह)

4

चुन-चुनकर कॉपी करना

मेटाडेटा वाले सेगमेंट छोड़कर बाकी सब आउटपुट में कॉपी करना

क्या बचा रहता है

  • • SOI/EOI मार्कर (ज़रूरी हैं)
  • • DQT (क्वांटाइज़ेशन टेबल)
  • • SOF (फ़्रेम हेडर)
  • • DHT (हफ़मैन टेबल)
  • • SOS और स्कैन डेटा (असली इमेज)
  • • आपकी मर्ज़ी: ICC कलर प्रोफ़ाइल

क्या हट जाता है

  • • APP1 EXIF (कैमरा, GPS, तारीख़ और समय)
  • • APP1 XMP (एडिटिंग का मेटाडेटा)
  • • APP13 IPTC (कैप्शन, लेखक)
  • • COM मार्कर (कमेंट)
  • • EXIF वाली थंबनेल इमेज

EXIF टैग की सूची

प्राइवेसी के मामले में सारे EXIF टैग एक जैसे नहीं होते। एक्सपोज़र सेटिंग जैसे कुछ टैग बिल्कुल हानिरहित हैं। वहीं सीरियल नंबर और मालिक के नाम जैसे टैग आपकी या आपके उपकरण की पहचान करा सकते हैं। जिन्हें हम ज़्यादा जोखिम वाला मानते हैं, वे ये हैं:

Tag IDनामप्राइवेसी का जोखिम
0x9003DateTimeOriginalज़्यादा
0x9004DateTimeDigitizedज़्यादा
0x9010OffsetTimeमध्यम
0x9286UserCommentज़्यादा
0x927CMakerNoteज़्यादा
0xA420ImageUniqueIDज़्यादा
0xA430CameraOwnerNameज़्यादा
0xA431BodySerialNumberज़्यादा
0xA434LensModelमध्यम
0xA435LensSerialNumberज़्यादा
0xFDE8OwnerNameज़्यादा
0xFDE9SerialNumberज़्यादा
कैमरा सेटिंग वाले सभी टैग देखें (जिनसे पहचान नहीं होती)
0x829A ExposureTime
0x829D FNumber
0x8822 ExposureProgram
0x8827 ISOSpeedRatings
0x9201 ShutterSpeedValue
0x9202 ApertureValue
0x9203 BrightnessValue
0x9204 ExposureBiasValue
0x9207 MeteringMode
0x9208 LightSource
0x9209 Flash
0x920A FocalLength
0xA001 ColorSpace
0xA002 PixelXDimension
0xA003 PixelYDimension
0xA402 ExposureMode
0xA403 WhiteBalance
0xA405 FocalLengthIn35mmFilm
0xA406 SceneCaptureType

GPS टैग की सूची

GPS डेटा अपने अलग sub-IFD में रहता है, जिसका पता मुख्य IFD के टैग 0x8825 से चलता है। अगर वह pointer मौजूद है, तो समझिए आपकी इमेज में लोकेशन का डेटा है। आजकल के स्मार्टफ़ोन यह डेटा जोड़ने में ख़ास तौर पर आगे रहते हैं, और अक्सर इतनी सटीकता से कि आप ठीक कहाँ खड़े थे, यह भी पता चल जाए।

Tag IDनामजानकारी
0x0000GPSVersionIDGPS टैग का वर्ज़न
0x0001GPSLatitudeRefN या S
0x0002GPSLatitudeडिग्री, मिनट, सेकंड
0x0003GPSLongitudeRefE या W
0x0004GPSLongitudeडिग्री, मिनट, सेकंड
0x0005GPSAltitudeRefसमुद्र तल से ऊपर या नीचे
0x0006GPSAltitudeमीटर में
0x0007GPSTimeStampUTC समय
0x001DGPSDateStampUTC तारीख़
0x0012GPSMapDatumजियोडेटिक सर्वे का डेटा
0x001BGPSProcessingMethodGPS/CELLID/WLAN/MANUAL
0x001CGPSAreaInformationजगह का नाम

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 (कीवर्ड)