JPEG壓縮不能預先預測。你描述的方法,壓縮&措施&再試一次,是我知道的唯一方法。
您可以嘗試壓縮具有不同質量設置的許多典型圖像,以瞭解最佳起點,以及猜測設置更改將如何影響尺寸的方法。這會讓你在沒有太多迭代的情況下將最佳尺寸歸零。
您也可以將類似文件的對象傳遞給不需要寫入磁盤的函數,只計算字節數。一旦你確定了最佳設置,那麼你可以再次保存到一個實際的文件。
編輯:這是一個合適的字節計數文件對象的實現。保存後只需檢查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
一個更好的辦法來做到這一點是二進制搜索的質量。因此,從50%質量開始,然後檢查尺寸,如果它太小,則嘗試75%,否則嘗試25%等等。您將盡可能接近500KB,另外可以設置一些其他參數,例如。最小的質量或尺寸公差。您應該能夠在最多7次迭代中調入正確的壓縮級別。 –