当前位置: 首页 > 面试题库 >

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

花飞尘
2023-03-14
问题内容

我要求压缩文件大小小于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


 类似资料:
  • 我正在使用Python的Pillow库来读取图像文件。如何使用哈夫曼编码进行压缩和解压缩?以下是说明: 您已经获得了一组示例图像,您的目标是在不丢失任何可感知信息的情况下尽可能压缩它们——解压后,它们应该看起来与原始图像相同。图像本质上存储为一系列颜色点,其中每个点表示为红色、绿色和蓝色(rgb)的组合。rgb值的每个分量范围在0-255之间,因此例如:(100, 0, 200)表示紫色。使用固定

  • 问题内容: 我认为这个问题与Zope无关。尽管如此,我将解释我要做什么: 我在Zope中使用PUT_factory通过FTP将图像上传到ZODB。上载的图像另存为Zope图像,位于新创建的容器对象中。效果很好,但是如果图像超过特定大小(宽度和高度),我想调整图像的大小。所以我正在使用PIL的缩略图功能来调整它们的大小,即200x200。只要上传的图像相对较小,此方法就可以正常工作。我没有检查出确切

  • 我想上传图像到服务器。将我的图像转换为位图,但仍然出错。位图太大,无法上传到纹理中 如果我得到图片使用画廊意味着我得到错误的位图太大,不能上传到纹理 如果我得到图片使用相机意味着得到错误的 造成:java.lang.安全例外:权限拒绝:阅读<-plhd--1/>MediaProvider uri内容://media/外部/图像/媒体从pid=18253,uid=10257需要android.per

  • 问题内容: 我有以下代码,我认为可以在指定的路径中调整图像的大小,但是当我运行它时,没有任何效果,但是python不会引发任何错误,所以我不知道该怎么做。请指教。谢谢。 问题答案: 您的错误属于文件的完整路径。代替 项目 必须是 path + item

  • 问题内容: 我正在尝试动态缩放文本,以将其放置在尺寸不同但已知的图像上。文本将用作水印。有什么方法可以根据图像尺寸缩放文本?我并不需要文字占据整个表面区域,而只是要使其足够可见即可,以使其易于识别且难以删除。我正在使用Python Imaging Library版本1.1.7。在Linux上。 我希望能够设置文本大小与图像大小的比率,比如说1/10大小。 我一直在寻找字体大小属性来更改大小,但是我

  • 对于我的图像压缩,我使用枕头库获得rgb中的每个像素(例如:(100,0200)。使用哈夫曼编码,我已经将其转换为二进制,以减少比特数。现在,我必须将位序列保存到文本或二进制文件中。压缩文件始终比原始文件小,但目前,我的txt文件比原始文件大。我该怎么办?在那之后,我如何读取文件并解压缩它。以下是说明: 您的代码应该读取图像文件,计算固定长度编码需要多少位,然后应用压缩算法创建较小的编码-您需要实