Python图像库(PIL),如何将图像压缩成所需的文件大小?
我要求压缩文件大小小于500kb的所有已上传图像,我已经在google上搜索了,我只能看到:
>>> foo = foo.resize((160,300),Image.ANTIALIAS)
>>> foo.save("path\\to\\save\\image_scaled.jpg",quality=95)
如果我采用这种方法,则必须检查压缩后图像是否小于500kb,如果不是,则选择较低的质量和尺寸。
有更好的方法吗?
-
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