यदि किसी छवि को दोषरहित रूप से घुमाया जाता है, तो फ़ाइल का आकार क्यों बदलता है?


37

मैं दोषरहित छवि के घूमने के तरीकों की खोज कर रहा था और इस सवाल पर हुआ जो इसे अच्छी तरह से समझाता है:

क्या "विंडोज फोटो व्यूअर" घूर्णन दोषरहित हैं?

इसलिए मैंने यादृच्छिक पिक्सेल (फ़ोटोशॉप क्लाउड फ़िल्टर) के साथ एक 256 × 256 जेपीईजी बनाया और फिर विंडोज पिक्चर व्यूअर का उपयोग करके इसे घुमाया। रोटेशन के बाद, फ़ाइल का आकार वास्तव में बढ़ गया, लेकिन केवल पहले रोटेशन पर। इसके बाद हर रोटेशन, फ़ाइल का आकार स्थिर रहा। मुझे पता है कि यह दोषरहित रूप से घूम रहा है क्योंकि मैंने इसे कई बार बिना किसी ध्यान देने योग्य गुणवत्ता के नुकसान के साथ घुमाया है जबकि 257 × 257 छवि को 20 बार घुमाए जाने से बहुत नुकसान हुआ।


8
आपके परीक्षणों में फ़ाइल का आकार कितना बढ़ गया?
जेम्स स्नेल

3
@JamesSnell मुझे पता था कि मुझे इसमें शामिल होना चाहिए। मैंने अभी-अभी GIMP के अंतर क्लॉथ फिल्टर का उपयोग किया था, जो मूल रूप से 14,583 बाइट्स था, लेकिन बदलकर 23,638 बाइट्स हो गया। यदि हम मेटाडाटा के बारे में अकेले ही बात कर रहे हैं तो यह 9000 से अधिक बाइट्स का अंतर है जो बहुत सारे अतिरिक्त डेटा की तरह लगता है।
oscilatingcretin

4
यह अतिरिक्त मेटाडेटा की तरह लगता है। मुझे मेटाडेटा होने के लिए अतिरिक्त डेटा के सभी मान लेने की जल्दी नहीं होगी। मुझे लगता है कि मेटाडेटा के कारण आकार में अंतर लगभग एक स्थिर होना चाहिए (कुछ संख्याओं के स्ट्रिंग प्रतिनिधित्व के लिए कुछ बाइट्स के भीतर)।
स्कॉटलैब

4
प्रश्न के लिए जर्मे को अतिरिक्त जानकारी प्रदान करते समय, कृपया टिप्पणी के बजाय प्रश्न में संपादित करें। टिप्पणियाँ अल्पकालिक हैं और समय-समय पर साफ हो सकती हैं।
स्कॉटलैब

2
आपकी परीक्षण छवि का मूल संस्करण अपलोड करना सहायक होगा।
कोडइन्चोसोस

जवाबों:


36

यह सबसे अधिक संभावना है कि एन्ट्रापी कोडिंग के कारण , जो जेपीईजी संपीड़न का अंतिम दोषरहित चरण है, छवि डेटा को उसके आकार को कम करने के लिए निर्धारित किया गया है।

जब एक जेपीईजी छवि को दोषरहित रूप से घुमाया जाता है, तो इस अंतिम दोषरहित एन्कोडिंग परत को पूर्ववत किया जाना चाहिए, अनपैक्ड डीसीटी गुणांक चारों ओर फेरबदल किया जाता है, और फिर फेरबदल वाले गुणांक को फिर से कूटबद्ध करने की आवश्यकता होती है। चूंकि एन्ट्रापी कोडिंग परत की दक्षता प्रत्येक ब्लॉक के भीतर डीसीटी गुणांकों के क्रम पर निर्भर करती है, जिससे घूर्णन छवि बदल जाएगी, यह आश्चर्य की बात नहीं होनी चाहिए कि घुमाया गया चित्र फ़ाइल मूल से कुछ प्रतिशत छोटा या बड़ा हो सकता है।

कई अलग-अलग तरीके भी हैं जिनमें एन्ट्रॉपी कोडिंग स्टेप किया जा सकता है, इसलिए यह काफी संभव है कि एन्कोडिंग करने वाले सॉफ़्टवेयर के आधार पर सटीक JPEG छवि का फ़ाइल आकार भिन्न हो सकता है। एनकोडर के बीच कुछ संभावित अंतर शामिल हैं:

  • अंकगणितीय एन्कोडिंग का विकल्प (दुर्लभ लेकिन संभावित रूप से अधिक कुशल, जिसका उपयोग पेटेंट कराया जाता है) बनाम हफ़मैन एन्कोडिंग (सरल, मानक);
  • अनुक्रमिक की पसंद (प्रत्येक 8x8 पिक्सेल ब्लॉक एक समय में एक एन्कोडेड है) बनाम प्रगतिशील (सभी ब्लॉकों के कम आवृत्ति घटकों को उच्च आवृत्ति घटकों से पहले एन्कोड किया जाता है, आमतौर पर थोड़ा अधिक कॉम्पैक्ट) एन्कोडिंग क्रम;
  • मानक हफ़मैन प्रतीक तालिकाओं का उपयोग करने का विकल्प (तेज, सरल, बहुत छोटी छवियों के लिए अधिक कुशल हो सकता है) बनाम प्रत्येक छवि के लिए अनुकूलित कस्टम तालिकाएं (आमतौर पर बड़ी छवियों के लिए अधिक कुशल, धीमी और सांकेतिक शब्दों में बदलना करने के लिए अधिक जटिल);
  • यदि कस्टम हफ़मैन तालिकाओं का उपयोग किया जाता है, तो विभिन्न एन्कोडर संभवतः एक ही छवि डेटा के लिए अलग-अलग तालिकाओं को उत्पन्न कर सकते हैं;
  • एन्कोडिंग प्रक्रिया के विभिन्न निम्न-स्तरीय विवरण, जैसे कि डेटा स्ट्रीम में पुनरारंभ मार्करों को शामिल करना है या नहीं, यह भी एन्कर्स के बीच भिन्न हो सकता है।

इसके अलावा, "जेपीईजी फ़ाइलें" लोगों को सामान्य रूप से साथ काम वास्तव में एक में लिपटे जेपीईजी संकुचित छवि डेटा शामिल JFIF या एक Exif कंटेनर, जो एक या अधिक मेटाडाटा ब्लॉक के साथ छवि डेटा को जोड़ती है, और जटिलताओं के अपने स्वयं के सेट प्रस्तुत करता है। भले ही वह सॉफ़्टवेयर जो छवि को घुमाता है, वास्तव में JFIF / Exif मेटाडेटा में कोई महत्वपूर्ण परिवर्तन नहीं करता है, बस डेटा को फिर से व्यवस्थित करना कुछ बाइट्स द्वारा फ़ाइल आकार को संभावित रूप से प्रभावित कर सकता है।

विशेष रूप से, JFIF / Exif मेटाडेटा में पूर्ण-आकार की छवि के एक या अधिक थंबनेल हो सकते हैं , और सॉफ़्टवेयर जो चित्रों को घुमाते हैं, उन्हें वास्तव में पुन: उत्पन्न करना चाहिए (या दोषरहित रूप से घुमाना भी चाहिए) ताकि वे पूर्ण के नए अभिविन्यास से मेल खाएंगे! आकार छवि। यह अकेले मनाया आकार अंतर के लिए आसानी से खाता हो सकता है।


4
9KB (60%) अंतर के लिए, मेरा अनुमान थंबनेल होगा।
ब्लूराजा - डैनी पफ्लुगुएफ्ट

JPEG इसके लिए बहुत सरल हो सकता है, क्योंकि यह एनकोडर के लायक है, लेकिन x264 जैसे वीडियो एनकोडर वास्तव में एंट्री कोडर की क्षमता पर विचार कर सकते हैं कि वे अगले आउटपुट के बारे में क्या सोचते हैं, जब रेट बनाम विरूपण ट्रेडऑफ निर्णय लेते हैं। (यानी यह निर्णय लेना कि प्रत्येक विकल्प में कितने बिट्स की लागत हो सकती है, और वजन कम करने वाली त्रुटि के खिलाफ है)। इसे ट्राइलेस क्वांटिज़ेशन कहा जाता है। X264 (लोरेन मेरिट) के लेखक से H.264 में ट्रेलिस परिमाणीकरण के कार्यान्वयन पर नोट्स देखें ; वह उद्देश्य के एक बहुत बुनियादी स्पष्टीकरण के साथ शुरू होता है।
पीटर कॉर्डेस

वैसे भी, इंगित किया जा रहा है, जेपीईजी एनकोडर ने डीसीटी गुणांक को चुना हो सकता है, जैसे कि वे एन्ट्रापी कोडर के साथ अच्छी तरह से संपीड़ित करते हैं, इसलिए यहां तक ​​कि एक इष्टतम कंप्रेसर छोटे रूप में एक घुमाए गए संस्करण नहीं बना सकता है। (क्योंकि उन्हें एक अलग क्रम में रखना शायद उन्हें कम अच्छी तरह से संपीड़ित करेगा।) यह लगभग निश्चित रूप से जेपीईजी के लिए एक छोटा प्रभाव होगा, क्योंकि प्रत्येक 8x8 ब्लॉक को अलग से कोडित किया जाता है (एन्ट्रापी कोडर, एएफएआईके की स्थिति को रीसेट करना)। (I.2 फ्रेम इन h.264 इंट्रा-प्रिडिक्शन का उपयोग करते हैं, एक ही फ्रेम में अन्य ब्लॉकों से भविष्यवाणी करते हुए, उन्हें समान दृश्य गुणवत्ता पर JPEG से छोटा बनाते हैं।)
पीटर कॉर्डेस

24

मैंने आगे बढ़कर प्रयोग को दोहराया कि क्या मैं समझ सकता हूं कि क्या चल रहा है।

प्रक्रिया

मैंने डिफ़ॉल्ट सेटिंग्स का उपयोग करके GIMP (फ़िल्टर> रेंडर> क्लाउड> सॉलिड नॉइज़ ...) में "सॉलिड नॉइज़" फिल्टर का उपयोग करके एक यादृच्छिक 256-बाय-256 पिक्सेल RGB छवि उत्पन्न की (नीचे दिखाया गया है):

यहाँ छवि विवरण दर्ज करें

और परिणाम:

यहाँ छवि विवरण दर्ज करें

तब मैंने डिफ़ॉल्ट सेटिंग्स का उपयोग करके छवि को JPEG के रूप में सहेजा:

यहाँ छवि विवरण दर्ज करें

फिर मैंने छवि को विंडोज़ में स्थानांतरित कर दिया और फ़ाइल एक्सप्लोरर में छवि पर राइट-क्लिक करके और मेनू से पूर्वावलोकन का चयन करके छवि को विंडोज फोटो व्यूअर के साथ खोला । फिर मैंने नीचे के बटनों का उपयोग करके छवि को घुमाया, और तीर कुंजियों का उपयोग करके अगली छवि पर नेविगेट करके छवि को बचाया।

नीचे दिए गए प्रत्येक परीक्षण के लिए मैंने मूल छवि की एक प्रति के साथ शुरुआत की, और बचत करने से पहले संबंधित संख्या को घुमाया (घुमाए गए बटन पर क्लिक किया)। यहां आकार देने वाले आकार ( ls -l -r) हैं:

                    size in bytes    last-modified date 
                          VVVVV        VVVVV
-rwxrwx--- 1 root vboxsf   6258 Nov  8 11:24 original.jpg
-rwxrwx--- 1 root vboxsf  23645 Nov  8 11:30 cw.jpg
-rwxrwx--- 1 root vboxsf  23636 Nov  8 11:30 cw-cw.jpg
-rwxrwx--- 1 root vboxsf  23649 Nov  8 11:30 cw-cw-cw.jpg
-rwxrwx--- 1 root vboxsf   6258 Nov  8 11:27 cw-cw-cw-cw.jpg
-rwxrwx--- 1 root vboxsf  23649 Nov  8 11:31 cw-cw-cw-cw-cw.jpg
-rwxrwx--- 1 root vboxsf  23649 Nov  8 11:29 ccw.jpg
-rwxrwx--- 1 root vboxsf  23636 Nov  8 11:29 ccw-ccw.jpg
-rwxrwx--- 1 root vboxsf  23645 Nov  8 11:29 ccw-ccw-ccw.jpg
-rwxrwx--- 1 root vboxsf   6258 Nov  8 11:27 ccw-ccw-ccw-ccw.jpg
-rwxrwx--- 1 root vboxsf  23649 Nov  8 11:30 ccw-ccw-ccw-ccw-ccw.jpg

तत्काल टिप्पणियों

  • विंडोज फोटो व्यूअर (WPV) आकार को नाटकीय रूप से बढ़ाता है; वृद्धि की मात्रा इस परीक्षण में लगभग चार गुना है!
  • सभी नई छवियां समान आकार में बढ़ जाती हैं, लेकिन वे समान नहीं हैं।
  • WPV उस छवि को फिर से एनकोड या री-सेव नहीं करता है, जब उसे 360 डिग्री से अधिक घुमाया जाता है। (टाइमस्टैम्प, 11:27, तब है जब फ़ाइलों को पहली बार कॉपी किया गया था।)

cmp -lसमान सामग्री वाली फ़ाइलों का उपयोग करने से हमें यह देखने की अनुमति मिलती है कि फ़ाइलें कहाँ भिन्न हैं।

robert@unity ../jpeg-rotate-test % cmp -l cw.jpg ccw-ccw-ccw.jpg
 2223  63  62
 2224  60  71
 2226  60  64
 2227  60  66
robert@unity ../jpeg-rotate-test % cmp -l cw-cw.jpg ccw-ccw.jpg
 2223  63  62
 2224  60  71
 2226  60  64
 2227  62  64
robert@unity ..jpeg-rotate-test % cmp -l ccw.jpg cw-cw-cw.jpg
 2223  62  63
 2224  71  60
 2226  64  60
 2227  61  64
robert@unity ../jpeg-rotate-test % cmp -l cw.jpg cw-cw-cw-cw-cw.jpg
 2221  60  61
 2223  63  61
 2224  60  66
 2226  60  61
 2227  60  61
robert@unity ../jpeg-rotate-test % cmp -l ccw.jpg ccw-ccw-ccw-ccw-ccw.jpg
 2223  62  63
 2224  71  60
 2226  64  65
 2227  61  64

ये फाइलें केवल चार बाइट्स (वास्तव में टाइमस्टैम्प) में भिन्न होती हैं, जिसका अर्थ है कि WPV हर बार एक ही काम कर रहा है; अब हमें केवल यह पता लगाना है कि वह क्या है।

विस्तृत अवलोकन

इसके लिए मैंने JPEGsnoop का उपयोग यह देखने के लिए किया कि वास्तव में छवियों में क्या था।

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

  • GIMP मेटाडेटा के लिए केवल APP0(JFIF) और COM(टिप्पणी) खंड का उपयोग करता है । WPV APP0खंड को अछूता छोड़ देता है , लेकिन उत्सुकता से टिप्पणी के लिए एक अशक्त बाइट जोड़ता है (ताकि यह शून्य-समाप्त हो जाए)।

  • WPV दो APP1खंडों को जोड़ता है, जो Exif और XMP मेटाडेटा हैं। ये सेगमेंट क्रमशः 4286 और 12726 बाइट्स हैं। साथ में वे फाइलों में लगभग पूरी वृद्धि के लिए खाते हैं।

  • GIMP एक प्रगतिशील JPEG का उत्पादन करता है, जबकि WPV एक आधारभूत (गैर-प्रगतिशील) JPEG का उत्पादन करता है। इस कारण से GIMP की छवि में कई स्कैन खंड हैं, जबकि WPV छवि में केवल एक है। मेरे अनुभव में प्रगतिशील छवि कभी-कभी थोड़ी छोटी होती है।

  • GIMP ने 1 × 1 क्रोमा सबसम्पलिंग का उपयोग किया, जबकि WPV ने 2 × 2 सबसम्पलिंग का उपयोग किया। यह मुझे विश्वास दिलाता है कि WPV "सच" दोषरहित रोटेशन का उपयोग नहीं कर रहा है, जब तक कि यह किसी भी तरह यह पता लगाने में सक्षम नहीं है कि यह एक ब्लैक-एंड-व्हाइट छवि है।

इन मुद्दों को हल करने के लिए, मैंने दूसरा परीक्षण चलाया।

प्रक्रिया

मैंने पहले परीक्षण के समान चरणों का पालन किया। मैंने निम्नलिखित चरणों के साथ RGB शोर फिल्टर (फ़िल्टर> नाक> RGB Nose ...) का उपयोग करके एक यादृच्छिक 256 × 256 RGB छवि बनाई:

यहाँ छवि विवरण दर्ज करें

यहाँ परिणाम है:

यहाँ छवि विवरण दर्ज करें

मैंने निम्न सेटिंग्स का उपयोग करके फ़ाइल को JPEG के रूप में निर्यात किया है:

यहाँ छवि विवरण दर्ज करें

प्रोग्रेसिव को बंद कर दिया गया है, लेकिन सबमप्लिमेंटिंग अभी भी 4: 4: 4 पर सेट है (जो 1 × 1 सबसम्पलिंग का दूसरा नाम है)। गुणवत्ता को बढ़ाकर 98 कर दिया गया है।

मैंने छवि को कॉपी किया और कॉपी को दक्षिणावर्त घुमाया; फिर घुमाए गए संस्करण की प्रतिलिपि बनाई और उस प्रति को वामावर्त घुमाया, ताकि हम सीधे मूल और WPP संसाधित प्रतिलिपि के बीच की गुणवत्ता की तुलना कर सकें।

परिणाम

-rwxrwx--- 1 root vboxsf 159774 Nov  8 16:21 original-random.jpg
-rwxrwx--- 1 root vboxsf 222404 Nov  8 16:24 cw-random.jpg
-rwxrwx--- 1 root vboxsf 222467 Nov  8 16:24 cw-ccw-random.jpg

यद्यपि इस समय की वृद्धि सापेक्ष रूप से छोटी है (लगभग 40%), पूर्ण वृद्धि इससे भी अधिक है - 62 kB के आसपास। यह बताता है कि WMV एक कम कुशल एन्कोडिंग का उपयोग कर रहा है।

मैं दो छवियों की तुलना करने के लिए ImageMagick का उपयोग करूँगा :

robert@unity ../jpeg-rotate-test % compare -verbose -metric AE original-random.jpg cw-ccw-random.jpg null:
original-random.jpg JPEG 256x256 256x256+0+0 8-bit sRGB 160KB 0.000u 0:00.009
cw-ccw-random.jpg JPEG 256x256 256x256+0+0 8-bit sRGB 222KB 0.010u 0:00.010
Image: original-random.jpg
  Channel distortion: AE
    red: 0
    green: 0
    blue: 0
    all: 0
original-random.jpg=> JPEG 256x256 256x256+0+0 8-bit sRGB 0.050u 0:00.020

कर रहे हैं शून्य पिक्सल अलग मूल और घुमाया प्रतिलिपि के बीच। इसलिए, भले ही WPV "सच" दोषरहित रोटेशन का उपयोग नहीं कर रहा है, यह काफी अच्छा काम कर रहा है। मुझे संदेह है कि मुझे पता है कि क्या चल रहा है, और समझाने के लिए मैं जेपीईजी संपीड़न के पीछे गणित में थोड़ा सा मोड़ दूंगा।

JPEG कंप्रेशन एल्गोरिदम एक छवि को 8 × 8-पिक्सेल ब्लॉक में तोड़ता है। इन ब्लॉकों में से प्रत्येक को फिर एक असतत कोसाइन ट्रांसफॉर्म (डीसीटी) के अधीन किया जाता है । परिणामस्वरूप डीसीटी गुणांक ब्लॉक को विभिन्न-आवृत्ति तरंगों के योग के रूप में वर्णित करते हैं। एल्गोरिथ्म तब उच्च आवृत्ति तरंगों में कुछ जानकारी "दूर फेंकता है" जो शोर और बहुत छोटे विवरण के अनुरूप है। डिकोडिंग प्रक्रिया डीसीटी को उलट देती है, संग्रहीत तरंगों को जोड़कर ब्लॉक वापस लाने के लिए।

डीसीटी "तरंगों" को वास्तव में बिना परिवर्तन के पूर्ववत करना और फिर से करना संभव है (मूल रूप से आप सभी क्षैतिज तरंगों को ऊर्ध्वाधर तरंगों में बदल देते हैं और इसके विपरीत)। मुझे लगता है कि WPV में ऐसा होता है कि छवि वास्तव में डीकोड की जाती है, घुमाई जाती है, और फिर पुनः एनकोड की जाती है। पुन: एन्कोडिंग प्रक्रिया के दौरान, चूंकि हमारी छवि का आकार दोनों आयामों में 8 से अधिक है, इसलिए प्रत्येक नए ब्लॉक मूल ब्लॉकों में से एक से मेल खाते हैं। महत्वपूर्ण रूप से, चूंकि प्रत्येक ब्लॉक में उच्च-आवृत्ति वाले घटक नहीं होते हैं, एल्गोरिथ्म किसी भी जानकारी को नहीं फेंकता है, और बिल्कुल सही डीसीटी घटकों को पाता है जो "सच" दोषरहित रोटेशन होगा।

अंत में, मैं JPEG फ़ाइलों के घटकों को फिर से देखूँगा। परिणाम फिर से gists के रूप में जुड़े हुए हैं । दो की तुलना:

  • WPV छवि में Exif मेटाडेटा के अतिरिक्त 4286 + 2 बाइट, टिप्पणी में 1 अतिरिक्त बाइट और XMP मेटाडेटा के 12,726 + 2 बाइट्स हैं। यह अतिरिक्त मेटाडेटा की कुल 17,017 बाइट्स है। वह सभी डेटा किसके लिए उपयोग किया जाता है? मैं अपने भरोसेमंद हेक्स संपादक और संबंधित मानकों की एक प्रति के साथ फाइल में शामिल हुआ:

    • Exif मेटाडाटा एक TIFF चित्र है, जो टैग की एक संख्या में शामिल की तरह संरचित है (वहाँ जिस तरह से अधिक जटिलता है, लेकिन मैं सही इस पर छोड़ देंगे)। EA1Cएक्सिफ़ खंड में अधिकांश बाइट्स टैग संख्या (59,932 दशमलव) के साथ दो समान टैग में समाहित हैं । वह टैग नंबर कहीं भी प्रलेखित नहीं है जो मुझे मिल सकता है। दोनों टैग में "अपरिभाषित" प्रकार के 2060 बाइट्स हैं, जो पहले छह ( 1C EA 00 00 00 08) को छोड़कर सभी अशक्त बाइट्स हैं । मुझे नहीं पता कि ये टैग क्या हैं, उनमें से दो क्यों हैं, और उन्हें प्रत्येक में 2 kB होने की आवश्यकता क्यों है।

    • एक्सएमपी मेटाडेटा वास्तव में नेमस्पेसिंग और लंबे यूयूआईडी के साथ एक संपूर्ण एम्बेडेड एक्सएमएल दस्तावेज है, जिसमें बस WPV संस्करण स्ट्रिंग (जो कि पहले से ही Exif मेटाडेटा में था) शामिल है। हालाँकि, यह केवल लगभग 400 बाइट्स के लिए खाता है। इस खंड के शेष भाग में 100 स्थानों के 122 पुनरावृत्तियाँ हैं, इसके बाद एक नई पंक्ति है । यह पूरी तरह से बर्बाद अंतरिक्ष के 12,000 से अधिक बाइट्स है।

  • पिछले परीक्षण की तरह, GIMP और WPV दोनों समान DCT परिमाणीकरण तालिकाओं का उपयोग करते हैं। इसका मतलब है कि उन्हें ठीक उसी डीसीटी गुणांक की गणना की जानी चाहिए, यही वजह है कि चित्र बिल्कुल समान हैं। मुझे यकीन नहीं है कि अगर WPV सिर्फ उसी परिमाणीकरण तालिकाओं का उपयोग कर रहा है या यदि यह इनपुट से तालिकाओं को कॉपी करता है।

  • पिछले परीक्षण के विपरीत, इस बार WPV 1 × 1 सबसेंपलिंग का उपयोग करता है, इसलिए यह वास्तव में यह पता लगा सकता है कि यह एक रंग छवि है (या कम से कम यह कि उच्च नमूने छवि को फिर से एनकोड करने के लिए आवश्यक हैं)।

  • GIMP और WPV अलग-अलग हफ़मैन तालिकाओं (एन्ट्रॉपी कोडिंग स्टेप का हिस्सा) का उपयोग करते हैं। WPV के लिए टेबल कुल 279 बाइट्स से बड़ी हैं, और एक मामले में 7 बार कई कोड होते हैं।

    JPEGsnoop के आँकड़ों को देखते हुए, हम देख सकते हैं कि इनमें से कुछ कोड शायद ही कभी उपयोग किए जाते हैं। उदाहरण के लिए, ID: 1, Class: ACतालिका में, 119 16-बिट कोड परिभाषित किए गए हैं, केवल 23 वास्तव में उपयोग किए जाते हैं। कुल मिलाकर, WPV संस्करण में वास्तविक स्कैन खंड 28.5% बड़ा है।

सारांश

  • WPV "सत्यहीन" दोषरहित घुमाव नहीं कर सकता है, लेकिन घूर्णन व्यावहारिक रूप से दोषरहित प्रतीत होता है।

  • अतिरिक्त आकार आंशिक रूप से अतिरिक्त मेटाडेटा की एक निश्चित मात्रा के कारण है, और आंशिक रूप से कम कुशल एन्ट्रापी कोडिंग के कारण है।

संस्करण जानकारी:

  • OS (लिनक्स) ( uname -a):

    Linux unity 3.16.0-4-amd64 #1 SMP Debian 3.16.36-1+deb8u1 (2016-09-03) x86_64 GNU/Linux
    
  • ओएस (विंडोज):

    यहाँ छवि विवरण दर्ज करें

  • GIMP (लिनक्स): 2.8.14 (पैकेज gimp, संस्करण से 2.8.14-1+deb8u1)

    यहाँ छवि विवरण दर्ज करें

  • विंडो फोटो दर्शक (छवि मेटाडेटा के अनुसार):

    Microsoft Windows Photo Viewer 10.0.10586.0
    

20

संपादित करें : यह उत्तर पोस्ट करने से पहले मुझे पता था कि फाइलें लगभग 9 KiB (25655 छवि के लिए 9055 बाइट्स, 512 × 512 छवि के लिए 9612 KiB) के आकार में वृद्धि हुई थीं।

सभी संभावना में, जब आपने पहली बार छवि को घुमाया, तो विंडोज पिक्चर व्यूअर ने निम्नलिखित चीजों में से एक (या दोनों) किया:

  1. एक EXIF ​​टैग जोड़ा गया जो मूल JPEG छवि (शायद ओरिएंटेशन टैग) में नहीं था;
  2. पहले से मौजूद एक टैग में संशोधित / जोड़ी गई जानकारी (शायद प्रोसेसिंग सॉफ्टवेयर या इमेज सॉफ्टवेयर टैग)।

अतिरिक्त EXIF ​​टैग (और / या मौजूदा टैग के लिए अतिरिक्त डेटा) के कारण फ़ाइल का आकार बढ़ गया।

इसके बाद के घूर्णन ने फ़ाइल का आकार नहीं बढ़ाया क्योंकि सभी टैग और / या टैग डेटा जो WPV जोड़ा / संशोधित किया गया था, वे पहले से ही वहां मौजूद थे। केवल ओरिएंटेशन टैग मान बदल गया (और शायद दिनांक / समय टैग मान भी)।


संपादित करें : यह लगभग निश्चित है कि यह स्पष्टीकरण फ़ाइल में लगभग 9 KiB अतिरिक्त डेटा के लिए जिम्मेदार नहीं है। इसके अलावा, आकार में वृद्धि के लिए किसी भी अन्य कारणों से अनुपस्थित है, यह स्पष्टीकरण यह उम्मीद करेगा कि आकार में वृद्धि कम या अधिक स्थिर होगी (न्यूमेरिक डेटा के स्ट्रिंग निरूपण के बीच कुछ लंबाई अंतर, शायद कुछ बाइट्स)। यह स्पष्ट रूप से नहीं है कि यहां क्या हो रहा है, कम से कम पूर्ण स्पष्टीकरण नहीं है।


1
और एक EXIF ​​टैग 9kB लेने वाला है? खैर, यह कम से कम परीक्षण करना आसान है - ओपीआई को हटाए गए चित्र से ओपीआईएफ या अन्य टैग हटाएं और देखें कि फ़ाइल का आकार कैसे बदलता है।
कार्ल विटथॉफ्ट

2
@CarlWitthoft 9kB नई जानकारी है। उस का उल्लेख करने के लिए संपादन।
स्कॉटलैब

3

रिवर्स इंजीनियरिंग के बिना jpeg en / decoder सुनिश्चित करने के लिए कहना असंभव है। वास्तव में जेपीईजी मानकों की एक संख्या है और लोकप्रिय विश्वास के विपरीत, उनमें से सभी को पुन: एन्कोडिंग के बिना संशोधित नहीं किया जा सकता है।

ऐसा नहीं है कि पहले संभव है को बचाने है अपने इष्ट jpeg स्वाद में एक हानिपूर्ण पुनर्लेखन और बाद में रोटेशन एक सरल मेटाडाटा ट्वीक या डीसीटी मेज पर सीधे एक ऑपरेशन (जो कुछ एन्कोडिंग योजनाओं के लिए संभव है) कर रहे हैं।

फ़ाइलों में वृद्धि में कुछ अतिरिक्त मेटाडेटा भी शामिल हो सकते हैं, हालांकि 9k बहुत कुछ लगता है, यह संभव है। वृद्धि को एक थंबनेल के अलावा के लिए भी देखा जा सकता है जो कि GIMP से आउटपुट में मौजूद नहीं हो सकता है। हम सीधे (WPV से पहले और बाद) फाइलों से अधिक जानकारी प्राप्त करने में सक्षम हो सकते हैं।

किसी भी स्थिति में, jpeg के साथ पूरी तरह से काम करने की कोशिश करना वास्तव में एक मूर्खता का कार्य है क्योंकि यह केवल कुछ छवि आकारों के साथ उपयोगी है, सभी डिकोडर और एनकोडर समान नहीं हैं और इसके लिए उन संपादकों को सीधे jpeg सामग्री के साथ काम करने की आवश्यकता होती है जिन पर आप भरोसा कर सकते हैं मामला ... सिर्फ इसलिए कि अब ऐसा नहीं है इसका मतलब यह नहीं है कि यह भविष्य में भी जारी रहेगा।

आपका बेहतर दांव दोषरहित प्रारूप के साथ काम करना और दर्द से पूरी तरह से बचना है।


2
मैं बिल्कुल भी आश्वस्त नहीं हूं कि घूमने वाले जेपीईजी डेटा को पहले स्थान पर फिर से एन्कोडिंग करना चाहिए।
कार्ल विटथॉफ्ट

निर्भर करता है कि आप एक प्रोग्रामर हैं या नहीं ... मेरा अनुमान है कि आप नहीं हैं। आपको विशेष रूप से उस अनुकूलन की तलाश करनी होगी ताकि वह न्यूनतम परिवर्तन कर सके अन्यथा एक सहेजा गया ऑपरेशन असम्पीडित बिटमैप से शुरू होगा।
जेम्स स्नेल

3
लिंक किए गए प्रश्न से, यह स्पष्ट है कि विंडोज फोटो दर्शक जेपीईजी को दोषरहित रूप से घुमाता है।
vclaw

2
@ जेम्स मैं एक निम्न-स्तरीय प्रोग्रामर नहीं हूं, 'मैं टीवी पर खेलता हूं :-)। ओपी ने एक सटीक विवरण के लिए एक लिंक प्रदान किया कि कब पुन: एन्कोडिंग होगी और कब नहीं। मुझे उस चर्चा से अनुमान लगा था कि वह केवल $ \ _ frac {\ pi} {2} $ से घूम रहा होगा। मैं मानता हूं कि मनमाना कोण रोटेशन फिर से एन्कोडिंग का कारण बनता है, और उस मामले के लिए जानकारी के नुकसान का कारण बनने जा रहा है जब तक कि एक्स-बाय-वाई छवि एक क्षेत्र में कम से कम कर्ण के रूप में बड़ी नहीं होती है।
कार्ल विटथॉफ्ट

1
हमें पूरा यकीन है कि हम जानते हैं कि WPV 8/16 के आयाम गुणकों वाली छवियों के लिए उल्टा घूम रहा है। देखिए @ ट्रिस्टन की मैट ओट से जुड़े सवाल पर मैट ग्रुम का जवाब। ट्रिस्टन ने माइक्रोसॉफ्ट में WPV टीम पर काम किया, और मूल रूप से पुष्टि करता है।
स्कॉट 7b

1

दोषरहित जेपीईजी रोटेशन केवल सीमा कलाकृतियों की शुरूआत के बिना संभव है यदि छवि आयाम ब्लॉक आकार के गुणक हैं (आमतौर पर [[/ हमेशा?] 8)। Jpegtran मैन पेज देखें (क्षमा करें, मेरे पास इसके लिए एक अच्छा विहित लिंक नहीं है, यदि आप इसमें शामिल हैं तो विवरण के लिए स्वतंत्र महसूस करें)

परिवर्तन परिवर्तन में छवि
आयामों के संबंध में कोई प्रतिबंध नहीं है । यदि छवि आयाम iMCU आकार (usu- सहयोगी 8 या 16 पिक्सेल) के एक से अधिक नहीं हैं, तो अन्य रूपांतर विषम रूप से संचालित होते हैं, क्योंकि वे केवल वांछित तरीके से DCT गुणांक डेटा के पूर्ण ब्लॉक को रूपांतरित कर सकते हैं।

जब एक विषम आकार की छवि
को बदलने के लिए jpegtran का डिफ़ॉल्ट व्यवहार
रूपांतरण सेट की सटीक प्रतिवर्तीता और गणितीय स्थिरता को संरक्षित करने के लिए डिज़ाइन किया गया है । जैसा कि कहा गया है, संक्रमण
पूरे छवि क्षेत्र को फ्लिप करने में सक्षम है। क्षैतिज मिररिंग किसी भी आंशिक iMCU कॉलम को दाएं किनारे पर अछूता छोड़ देता है, लेकिन छवि की सभी पंक्तियों को फ्लिप करने में सक्षम है। इसी प्रकार, वर्टिकल मिररिंग किसी भी आंशिक iMCU पंक्ति को निचले किनारे पर अछूता छोड़ देता है, लेकिन सभी कॉलमों को फ्लिप करने में सक्षम है। अन्य परिवर्तनों को संक्रमण और फ्लिप संचालन के अनुक्रम के रूप में बनाया जा सकता है; स्थिरता के लिए, किनारे के पिक्सल्स पर उनके कार्यों को इसी ट्रांसपोज़ और एंड-फ्लिप अनुक्रम के अंतिम परिणाम के रूप में परिभाषित किया गया है।

व्यावहारिक उपयोग के लिए, आप रूपांतरित छवि
के
दाएं और / या नीचे किनारों के साथ एक अजीब दिखने वाली पट्टी होने के बजाय किसी भी अपरिवर्तनीय किनारे के पिक्सल को त्यागना पसंद कर सकते हैं । ऐसा करने के लिए, -trim स्विच जोड़ें:

मुझे संदेह है कि विंडोज फोटो व्यूअर दोषरहित व्यवहार का अनुकरण करने के लिए विघटन और अति-उच्च-गुणवत्ता वाले पुनर्मूल्यांकन करके इस मुद्दे से बच रहा है जब छवि आयाम वास्तव में दोषरहित रोटेशन करने के बजाय 8 के गुणक नहीं होते हैं। एक अच्छी उपयोगिता बस वास्तविक दोषरहित, कलाकृतियों और सभी को करेगी, या पूरी छवि की गुणवत्ता को बर्बाद करने (और फ़ाइल का आकार बढ़ाने) के बजाय कुछ पिक्सेल छोड़ देगी।


1
एक 256x256 छवि के लिए अप्रासंगिक।
चौथाई

मैंने गलत सोचा और सोचा कि यह मुद्दा 257x257 संस्करण के लिए था।
आर ..

0

मेरे पास कोई निश्चित उत्तर नहीं है लेकिन ऐसा क्यों हुआ, इसके कुछ संभावित सिद्धांत। कुछ फ़ाइल प्रकार इस तरह से काम करते हैं कि फाइल प्रकार की छवि के लिए दो अलग-अलग कोड आवश्यक रूप से अलग-अलग छवियों का उत्पादन नहीं करते हैं। उदाहरण के लिए, पीएनजी फ़ाइल प्रकार उस तरह से काम करता है क्योंकि यह एक पारदर्शी पृष्ठभूमि के लिए अनुमति देता है लेकिन एक पारदर्शी पृष्ठभूमि के साथ एक छवि और एक ही है, सिवाय इसके कि एक ही पृष्ठभूमि सफेद है बिल्कुल उसी तरह से दिखाई देती है। यदि प्रति पिक्सेल 3 बाइट्स से कम मेमोरी लगती है, तो एक छवि फ़ाइल को संपीड़ित कहा जाता है। मेरा मानना ​​है कि पारदर्शी पृष्ठभूमि वाले लोगों को छोड़कर, कोई भी दो पीएनजी फाइलें ठीक उसी छवि को उत्पन्न नहीं करती हैं। जब आप कभी भी किसी चित्र को PNG के रूप में सहेजते हैं, तो यह एक ऐसे कोड में परिवर्तित हो जाता है जो मूल छवि को उत्पन्न करता है और बहुत ही असामान्य छवियों को छोड़कर, जैसे कि प्रत्येक पिक्सेल सभी 2 ^ 24 रंगों का एक यादृच्छिक रंग है, कोड 3 बाइट्स प्रति पिक्सेल से कम मेमोरी लेगा इसलिए पीएनजी को दोषरहित संपीड़न कहा जाता है। दूसरी ओर, मेमोरी को बचाने के लिए, केवल कुछ छवियों को जेपीईजी इमेज फाइल के कोड द्वारा उत्पन्न किया जा सकता है। संभवतः एक से अधिक JPEG फ़ाइल प्रकार हैं और मुझे नहीं पता कि उनमें से किसी के पास संपत्ति है या नहीं, उस फ़ाइल प्रकार की दो भिन्न छवियां सटीक समान छवि उत्पन्न कर सकती हैं। मैं मान रहा हूं कि कई बार आपने केवल एक छवि घुमाई और फिर इसे जेपीईजी के रूप में सहेजा और इस बात का स्पष्टीकरण दिया कि इस धारणा के तहत क्या हुआ कि आपने वही किया जो मुझे नहीं पता कि क्या सच है। आपके द्वारा किया गया एक रोटेशन दोषरहित है यदि आपके द्वारा इसे घुमाए जाने से पहले और इसे सहेजने से पहले आपके पास ठीक उसी छवि फ़ाइल कोड को प्राप्त करने का एक तरीका है। आप सही नहीं हो सकते हैं कि आपने वास्तव में एक दोषरहित रोटेशन किया था। यदि यह वास्तव में दोषरहित था,


-3

इसके पीछे कारण कुछ हैं

जिस तरह से छवियों को कोडित किया जाता है और संपीड़ित एल्गोरिथ्म के कारण संपीड़ित केवल आकार बदल देगा। आप इसे बिटमैप के रूप में सहेज कर और फिर इसे घुमाकर इसका परीक्षण कर सकते हैं। उस प्रारूप या किसी भी कच्चे प्रारूप में आकार समान रहना चाहिए। यदि ऐसा नहीं होता है तो छवि को बचाने वाला कार्यक्रम संभवतः कुछ मेटाडेटा या कुछ नया डेटा जोड़ रहा है।

लेकिन आप 20 बार jpeg क्यों घुमा रहे हैं?


2
यदि आप मूल प्रश्न में लिंक पढ़ते हैं , तो कम से कम विंडोज पिक्चर व्यूअर के लिए , यदि जेपीईजी के आयाम 8 से अधिक हैं, तो डब्ल्यूपीवी में जेपीईजीएस के रोटेशन हानिरहित परिवर्तन हैं। परीक्षण करने का एक सरल तरीका जो 4 बार घूमना है (परिणामस्वरूप मूल के रूप में समान अभिविन्यास) और एक साधारण पिक्सेल-बाय-पिक्सेल पिक्सेल घटाव प्रदर्शन करना।
स्कॉटलैब

@scottbb यह केवल विंडोज़ पिक्चर दर्शक के साथ समस्या नहीं है। जो कुछ भी एक हानिपूर्ण प्रारूप को घुमाता है उसे संपीड़न को पुनर्गणना करना पड़ता है। 8 के गुणकों में एक छवि को घुमाने का मतलब है कि सब कुछ 8 बिट शब्दों में फिट बैठता है और कलाकृतियों को जोड़ने वाले तरीके से संकुचित नहीं हो सकता है। यह एल्गोरिथ्म कैसे काम करता है और उपयोग किए गए प्रोग्राम में लागू किया गया है पर आधारित है।
Cc Dd

-3

क्योंकि छवियों का संपीड़न कैसे काम करता है । पीएनजी या जेपीजी जैसे कोई भी प्रारूप सामान्य रूप से रोटेशन के बाद फ़ाइल के आकार को संरक्षित नहीं करते हैं।

कंप्रेसर के लिए घुमाया गया चित्र सिर्फ एक अलग छवि है, इस कारण कि संपीड़न हेयुरिस्टिक कैसे काम करता है इसकी कोई गारंटी नहीं है यह एक घुमाए गए छवि को समान करेगा

निश्चित रूप से अगर संपीड़न दोषरहित है, यदि आप 4 बार छवि को 4 बार घुमाते हैं, तो छवि फिर से समान है (घुमाया जाता है जब तक कि यह मूल के रूप में झुका हुआ न हो): उस स्थिति में यह फिर से उसी संकुचित आकार का हो जाना चाहिए, यदि नहीं तो यह निम्न कारणों में से एक है :

  • जोड़ा गया मेटाडेटा : कार्यक्रम ने किसी कारण से पाठ का कुछ हिस्सा जोड़ा
  • कंप्रेसर बदला गया: प्रोग्राम केवल छवि को मूल के रूप में फिर से सहेजने के लिए चुन सकता है यदि कोई परिवर्तन नहीं हैं, लेकिन यदि आप कोई भी परिवर्तन (यहां तक ​​कि 4 डिग्री 90 डिग्री तक) लागू करते हैं, तो वह फिर से छवि को फिर से संपीड़ित करने का निर्णय ले सकता है कंप्रेसर (कार्यक्रम अब नहीं जानता कि यह अभी भी वही छवि है)।
  • सामान्य तौर पर एक ही कंप्रेसर (libPNG या libJPG) अलग-अलग कार्यान्वयन के दौरान बहुत भिन्न परिणाम देता है, एक ही पुस्तकालय के विभिन्न संस्करणों और अलग-अलग संपीड़न मापदंडों के साथ (ऑपरेटिव सिस्टम और कंपाइलर भी कभी-कभी यहां एक अंतर बनाता है)।

छवि संपीड़न छवियों को 4x4 या अन्य आकारों के विखंडों में संकुचित करके काम करता है। सामान्य तौर पर एक कंप्रेसर एक घुमाई गई छवि को एक अलग छवि के रूप में देखता है, हालांकि चूंकि एक संकुचित पिक्सेल चंक बस एक रैखिक अपघटन है, अगर छवि पर विखंडू समान हैं यह सिर्फ ट्रांसपोज़ / मिरर करना संभव है रैखिक रेखांकन अपघटन प्रभावी रूप से एक ही रखते हुए गुणवत्ता:

ध्यान दें कि इसे प्रति सुविधा के आधार पर लागू किया जाना है , और यह भी आकार में प्रारंभिक वृद्धि => पहले रोटेशन पर समझाता है यह केवल घूमने योग्य छवि में छवि को संपीड़ित करने की कोशिश करता है:

  • यदि यह ऐसा करने में विफल रहता है: छवि गुणवत्ता खराब हो जाती है
  • यदि यह सफल है तो यह केवल एक बार आकार में वृद्धि करता है, फिर हर घुमाव समान गुणवत्ता रखता है।

  • यह ऑपरेशन केवल तभी सफल होता है जब छवि समान विखंडनों द्वारा बनाई गई हो। (छवि का आकार कई आकार का है)।

Scottbb उत्तर गलत है और आप एक सरल परीक्षण कर सकते हैं:

  • मूल छवि खोलें: इसे स्क्रीनशॉट करें
  • WPV के साथ छवि को 4 बार घुमाएं: इसे स्क्रीनशॉट करें
  • 2 स्क्रीनशॉट की तुलना करें

आप छवि को बदल कर देखेंगे (यह पहले घुमाव पर फिर से दबा हुआ है)। हालांकि यह परिवर्तन समय में सीमित है, अब आप इसे गुणवत्ता के नुकसान के बिना फिर से घुमा सकते हैं (यदि छवि का आकार 8 से अधिक है)

ओपी को सीधे जवाब देने के लिए:

मुझे पता है कि यह दोषरहित रूप से घूम रहा है

नहीं यह दोषरहित घूर्णन नहीं है, यह कम से कम एक बार गुणवत्ता खो देता है (पहले रोटेशन पर: क्योंकि इसे पहले इसे इस तरह से संपीड़ित करना चाहिए कि इसे घुमाया जा सकता है), फिर यह अपनी गुणवत्ता बनाए रखता है।


1
प्रश्न दोषरहित रोटेशन के बारे में है, इसलिए पुनर्मूल्यांकन से बचा जाता है।
Agent_L

5
ओपी ने सामान्य मामले के बारे में नहीं, बल्कि उस विशिष्ट सॉफ्टवेयर के एक टुकड़े के बारे में पूछा और वह एक विशिष्ट मामला जो ऐसा करता है। आपका उत्तर गलत नहीं है, यह केवल ओपी द्वारा पूछे गए सवाल से अलग प्रश्न का उत्तर देता है।
Agent_L

1
पहले 3 वाक्य अभी भी एक अलग सवाल पर हैं: "छवियों का संपीड़न कैसे काम करता है" - दोषरहित रोटेशन में कोई संपीड़न नहीं है। "कंप्रेसर को घुमाए गए छवि के लिए" - फिर से, कंप्रेसर को लागू नहीं किया जाता है। "यदि संपीड़न दोषरहित है" - संपीड़न हानिपूर्ण है। रोटेशन दोषरहित है। अब, मैं इस तर्क को लेने के लिए तैयार हूं। मैं आपकी बात देख सकता हूं, मैं इससे सहमत हूं, लेकिन यह पूरी तरह से यहां से बाहर है। BTW, मैं एक प्रोग्रामर भी हूं और मैंने अपने हिस्से की कच्ची फाइल पढ़ने और लिखने का काम किया।
Agent_L

1
मैंने पेंट में एक छवि बनाई है, इसे 4 बार घुमाया और यह समान है, लेकिन आकार फिर भी 1.6 से 8.1 केबी तक कूद गया। बाइनरी अंतर दिखाता है कि छवि डेटा अछूता था, यह <?xpacketटैग में मेटाडेटा का सिर्फ बड़ा हिस्सा है ।
Agent_L

1
यदि जेपीईजी के आयाम समान रूप से 8 (या सबसामलिंग के साथ 16) से विभाज्य हैं, तो इसे 90 डिग्री की वृद्धि में दोषरहित रूप से घुमाया जा सकता है । कुंजी यह आरजीबी के लिए सभी तरह से डिकोड नहीं करना है, लेकिन डीसीटी गुणांक के साथ सीधे काम करना है। यह एक विशेष कार्य है जो अक्सर एक सामान्य छवि संपादक में शामिल नहीं होता है। उदाहरण के लिए देखें en.wikipedia.org/wiki/Libjpeg#jpegtran । यदि आपने प्रश्न में निर्दिष्ट के रूप में विंडोज फोटो व्यूअर के साथ अपना प्रयोग किया है , तो आप देखेंगे कि यह वास्तव में दोषरहित है।
मार्क रैनसम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.