Die JPEG-Komprimierung ist vorher nicht vorhersehbar. Die Methode, die Sie beschrieben, komprimieren & Maßnahme & versuchen Sie es erneut, ist der einzige Weg, den ich kenne.
Sie können versuchen, eine Anzahl typischer Bilder mit unterschiedlichen Qualitätseinstellungen zu komprimieren, um eine Vorstellung von dem optimalen Startpunkt zu erhalten. Außerdem können Sie erraten, wie sich Änderungen an der Einstellung auf die Größe auswirken. Das bringt Sie auf die optimale Größe ohne zu viele Iterationen.
Sie können auch ein dateiähnliches Objekt an die save
-Funktion übergeben, die nicht auf die Festplatte schreibt, sondern nur die Bytes zählt. Sobald Sie die besten Einstellungen festgelegt haben, können Sie sie erneut in einer tatsächlichen Datei speichern.
Edit: Hier ist eine Implementierung eines geeigneten Bytezählung Dateiobjekt. Überprüfen Sie einfach size
nach dem Speichern.
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)
Edit 2: Hier ist eine binäre Suche, die oben mit der optimalen bekommen quality
in der geringsten Anzahl von Versuchen.
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
Eine bessere Möglichkeit, es zu tun ist, um die Qualität binärer Suche. Beginnen Sie also mit 50% Qualität, dann überprüfen Sie die Größe, wenn es zu klein ist, dann versuchen Sie 75%, sonst versuchen Sie 25%, etc. Sie werden so nah wie möglich an 500KB kommen, können Sie zusätzlich einige zusätzliche Parameter, z. Mindestqualität oder Größentoleranz. Sie sollten in der Lage sein, auf die korrekte Komprimierungsstufe in maximal 7 Iterationen auf Null zu setzen. –