Python图像库(PIL),如何将图像压缩成所需的文件大小?

发布于 2021-01-29 18:19:42

我要求压缩文件大小小于500kb的所有已上传图像,我已经在google上搜索了,我只能看到:

 >>> foo = foo.resize((160,300),Image.ANTIALIAS)
 >>> foo.save("path\\to\\save\\image_scaled.jpg",quality=95)

如果我采用这种方法,则必须检查压缩后图像是否小于500kb,如果不是,则选择较低的质量和尺寸。

有更好的方法吗?

关注者
0
被浏览
176
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    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
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看