JPEG 压缩无法事先预测。你描述的方法,压缩&测量&重试,是我知道的唯一方法。
您可以尝试使用不同的质量设置压缩许多典型图像,以了解最佳起点,以及猜测设置更改将如何影响大小的方法。这将使您在没有太多迭代的情况下将最佳尺寸归零。
您还可以将类似文件的对象传递给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