2010-12-04 12 views
13

में जेपीजी गुणवत्ता निर्धारित करना मैं पाइथन में पीआईएल लाइब्रेरी के साथ खेल रहा हूं और मुझे आश्चर्य है कि मैं दी गई जेपीजी छवि की गुणवत्ता कैसे निर्धारित करूं। मैं जेपीजी छवि को खोलने की कोशिश करता हूं और इसे अपनी मूल गुणवत्ता में फिर से सहेजता हूं। Image.save मुझे वांछित गुणवत्ता निर्धारित करने दें:पायथन (पीआईएल)

im.save(name, quality = x) 

लेकिन मुझे मूल निकालने का कोई तरीका नहीं दिख रहा है। अभी के लिए मैं बस अनुमान लगा रहा हूं और 'गुणवत्ता' पैरामीटर पर द्विआधारी खोज करके इनपुट के समान आकार की आउटपुट फ़ाइल रखने का प्रयास कर रहा हूं लेकिन यह स्वीकार्य दीर्घकालिक समाधान नहीं है :)
मैंने भी इसका उपयोग करने का प्रयास किया: Image.info लेकिन अधिकांश मेरी छवियों में कोई उपयोगी जानकारी नहीं है (उदा: 'एडोब', 'icc_profile', 'exif', 'adobe_transform')
सहायता!

+1

प्रासंगिक जानकारी: http://superuser.com/questions/62730/how-to-find-the-jpg-quality/91083#91083 – unutbu

+0

सामान्य यह सटीक ठीक करने के लिए संभव नहीं है में एक जेपीईजी फ़ाइल को संपीड़ित करने के लिए उपयोग की जाने वाली गुणवत्ता मान क्योंकि संग्रहित जानकारी को कम करने के विभिन्न तरीके हैं और गुणवत्ता मान केवल एन्कोडर के लिए दिशानिर्देश है, लेकिन @unutbu बताते हैं, कुछ सॉफ़्टवेयर एक वीर अनुमान लगा सकते हैं। – andrewmu

+1

यह शायद उल्लेखनीय है कि जेपीईजी एक हानिकारक प्रारूप है, इसलिए छवि को खोलने और सहेजने से छवि गुणवत्ता में कमी आएगी, भले ही "गुणवत्ता" विकल्प एक ही मूल्य पर सेट हो। –

उत्तर

22

पीआईएल में (और अधिकतर सभी सॉफ्टवेयर/librairies जो libjpeg का उपयोग करते हैं) गुणवत्ता सेटिंग क्वांटिज़ेशन टेबल (ref.) बनाने के लिए उपयोग की जाती है। Libjpeg में गुणवत्ता संख्या "स्केल" नमूना तालिका मान (जेपीईजी विनिर्देश अनुभाग K.1 से)। अन्य librairies में विभिन्न गुणों को अलग-अलग गुणों को निर्दिष्ट किया जाता है (उदा .: फ़ोटोशॉप, डिजिटल कैमरा)।

तो, अन्य शब्दों में, क्वांटिज़ेशन टेबल के बराबर गुणवत्ता, इसलिए यह केवल एक संख्या अधिक जटिल है।

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

from subprocess import Popen, PIPE 
from PIL import Image, ImageFilter 

proc = Popen('%s -sample 1x1 -optimize -progressive -qtables %s -outfile %s' % ('path/to/cjpeg', '/path/ta/qtable', 'out.jpg'), shell=True, stdin=PIPE, stdout=PIPE, stderr=PIPE) 
P = '6' 
if im.mode == 'L': 
    P = '5' 
stdout, stderr = proc.communicate('P%s\n%s %s\n255\n%s' % (P, im.size[0], im.size[1], im.tostring())) 

आप जिस तरह से मूल jpeg से परिमाणीकरण तालिका को निकालने के लिए खोजने की जरूरत होगी:

यहाँ कुछ किसी न किसी तरह कोड है कि एक निर्दिष्ट परिमाणीकरण मेज के साथ एक jpeg को बचाने के लिए है।

djpeg -verbose -verbose image.jpg > /dev/null 

तुम भी आवश्यकता होगी खोजने के लिए और नमूना सेट करने के लिए: djpeg कि (libjpeg का हिस्सा) कर सकते हैं। उस चेक here पर अधिक जानकारी के लिए। तुम भी पर test_subsampling

अद्यतन

मैं सबसैम्पलिंग या परिमाणीकरण टेबल या दोनों जब जेपीईजी बचत निर्दिष्ट करने के लिए संभावना को जोड़ने के लिए एक जनहित याचिका कांटा किया देख सकते हैं। सहेजते समय आप quality='keep' भी निर्दिष्ट कर सकते हैं और छवि को उसी क्वांटिज़ेशन टेबल के साथ सहेजा जाएगा और मूल के रूप में subsampling (मूल रूप से एक जेपीईजी होना आवश्यक है)। कुछ प्रीसेट (फ़ोटोशॉप पर आधारित) भी हैं जिन्हें आप सहेजते समय गुणवत्ता में पारित कर सकते हैं। My fork.

अद्यतन 2

मेरे कोड अब Pillow 2.0 का हिस्सा है। तो बस कार्य करें:

pip install Pillow 
+2

क्वांटिज़ेशन टेबल 'PIL.JpegImagePlugin.JpegImageFile'' की 'क्वांटिलाइज़ेशन' विशेषता में भी उपलब्ध हैं (यह वह प्रकार है जब आप 'Image.open' एक जेपीईजी फ़ाइल प्राप्त करते हैं)। – adw

+0

यह जानना अच्छा है। तो पीआईएल में लापता एकमात्र चीज सहेजते समय क्वांटिज़ेशन टेबल निर्दिष्ट (पास) करने का एक तरीका है। – Etienne

+0

मीठे, विशेष रूप से यह 3.3 के साथ काम करता है; मुझे खुशी है कि आपको यह पुराना प्रश्न याद आया :) –

-3

जहां तक ​​मैंने आपको समझा, यह संभव नहीं है। जेपीईजी प्रारूप को 75% रंग डेटा, या रंगों को सरल बनाकर संपीड़ित किया जाता है। रंग की गुणवत्ता को उच्च बनाने का कोई तरीका नहीं है।

+0

जेपीईजी "75% रंग डेटा को हटाकर या रंगों को सरल बनाकर संपीड़ित नहीं करता है।" यह रंगीन रूपांतरण को एक अधिक कुशल रंगस्थान (वाईसीबीसीआर) में करता है, लेकिन यह केवल पहला कदम है। – kidjan

+0

एफवाईआई: जेपीईजी आमतौर पर 75% रंग डेटा (4: 2: 0 subsampling) को हटाकर संपीड़ित करता है। – Arel

4

गुणवत्ता कुछ ऐसा है जो जेपीईजी में संग्रहीत डेटा जेनरेट करने के लिए उपयोग किया जाता है। यह संख्या जेपीईजी में संग्रहीत नहीं है।

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

आप अभी भी गुणवत्ता के साथ एक बाइनरी खोज कर रहे हैं, लेकिन यह बहुत कम काम है।

यहाँ कैसे JPEG संपीड़न एक एमएस पूछे जाने वाले प्रश्न

से काम करता है

http://www.dspguide.com/ch27/6.htm

यहाँ एक और तरीका

http://support.microsoft.com/kb/324790

आप सी # से अनुवाद करने के लिए है के बारे में जानकारी है।

संबंधित मुद्दे