जेपीईजी संपीड़न पहले से अनुमानित नहीं है। आपके द्वारा वर्णित विधि, & माप & फिर से प्रयास करें, मुझे पता है कि एकमात्र तरीका है।
आप इष्टतम प्रारंभिक बिंदु का विचार प्राप्त करने के लिए विभिन्न गुणवत्ता वाली छवियों के साथ कई सामान्य छवियों को संपीड़ित करने का प्रयास कर सकते हैं, साथ ही अनुमान लगाने का एक तरीका आकार में परिवर्तन कैसे प्रभावित करेगा। इससे आपको बिना किसी पुनरावृत्ति के इष्टतम आकार में शून्य मिल जाएगा।
आप save
फ़ंक्शन पर फ़ाइल जैसी ऑब्जेक्ट भी पास कर सकते हैं जो डिस्क पर लिखने के लिए परेशान नहीं है, बस बाइट्स की गणना करता है। एक बार जब आप सर्वोत्तम सेटिंग्स निर्धारित कर लेंगे तो आप इसे फिर से एक वास्तविक फ़ाइल में सहेज सकते हैं।
संपादित करें: यहां एक उपयुक्त बाइट गिनती फ़ाइल ऑब्जेक्ट का कार्यान्वयन है। सहेजने के बाद बस size
देखें।
class file_counter(object):
def __init__(self):
self.position = self.size = 0
def seek(self, offset, whence=0):
if whence == 1:
offset += self.position
elif whence == 2:
offset += self.size
self.position = min(offset, self.size)
def tell(self):
return self.position
def write(self, string):
self.position += len(string)
self.size = max(self.size, self.position)
संपादित करें 2: यहाँ एक द्विआधारी खोज के ऊपर का उपयोग कर प्रयास की सबसे छोटी संख्या में इष्टतम quality
प्राप्त करने के लिए है।
def smaller_than(im, size, guess=70, subsampling=1, low=1, high=100):
while low < high:
counter = file_counter()
im.save(counter, format='JPEG', subsampling=subsampling, quality=guess)
if counter.size < size:
low = guess
else:
high = guess - 1
guess = (low + high + 1) // 2
return low
स्रोत
2012-11-15 23:08:59
यह गुणवत्ता खोज बाइनरी में है क्या करने के लिए एक बेहतर तरीका हो रही होगी। तो 50% गुणवत्ता के साथ शुरू करें, फिर आकार की जांच करें, यदि यह बहुत छोटा है तो 75% कोशिश करें, अन्यथा 25% कोशिश करें, आदि। आप 500 केबी तक जितना संभव हो उतना करीब मिलेंगे, आप अतिरिक्त अतिरिक्त पैरामीटर सेट कर सकते हैं, उदाहरण के लिए। न्यूनतम गुणवत्ता या आकार सहिष्णुता। आपको अधिकतम 7 पुनरावृत्तियों में सही संपीड़न स्तर में शून्य करने में सक्षम होना चाहिए। –