如何使用python PIL库压缩小于限制文件大小的图片?

问题描述 投票:0回答:3

我需要将图片发送到另一个地方,那里要求图片大小必须小于512kb。
我使用

PIL
来处理从互联网下载的图片。所以我不知道下一张图片的尺寸是多少,代码如下:

from PIL import Image
picture_location = '/var/picture/1233123.jpg'
compressed_picture_location = '/var/picture/1233123_compressed.jpg'
im = Image.open(picture_location)
quality = 75
im.save(compressed_picture_location, quality=quality)
im.save()

问题是压缩图片的文件大小不是原始图片的75%或75%*75%,所以我必须压缩它,统计它,再次压缩,我无法选择合适的质量值。

还有其他方法可以解决这个问题吗? 请帮助或尝试给出一些如何实现这一目标的想法。

python python-imaging-library
3个回答
2
投票

当您使用 PIL 更改质量时,图像的尺寸不会改变,它只是使用 JPEG 压缩更改图像的质量。默认情况下该值为 80,因此将该值更改为 75 不会使尺寸减小太多,您可以将该值更改为 60 左右,而不会损失很多图像质量。该值以对数方式减少,因此如果您想要精确的数学计算,可以阅读有关 JPEG 压缩的内容。 https://math.dartmouth.edu/archive/m56s14/public_html/proj/Marcus_proj.pdf


2
投票

不幸的是,这是 JPEG 压缩的一个属性,并且没有严格的反函数(如果你想要大规模效率,你可以通过数学计算它)。

但是,您可以低效地强制计算并使其接近以下结果。如果您不想要相同的尺寸,只需将质量更改为缩放因子,它应该可以类似地工作。

import os
from PIL import Image

def compress_under_size(size, file_path):
    '''file_path is a string to the file to be custom compressed
    and the size is the maximum size in bytes it can be which this 
    function searches until it achieves an approximate supremum'''

    quality = 90 #not the best value as this usually increases size

    current_size = os.stat(file_path).st_size

    while current_size > size or quality == 0:
        if quality == 0:
            os.remove(file_path)
            print("Error: File cannot be compressed below this size")
            break

        compress_pic(file_path, quality)
        current_size = os.stat(file_path).st_size
        quality -= 5


def compress_pic(file_path, qual):
    '''File path is a string to the file to be compressed and
    quality is the quality to be compressed down to'''
    picture = Image.open(file_path)
    dim = picture.size

    picture.save(file_path,"JPEG", optimize=True, quality=qual) 

    processed_size = os.stat(file_path).st_size

    return processed_size

for file in os.listdir("pics"):
    try:
        pic = f"./pics/{file}"
        compress_under_size(10000,pic)
    except Exception:
        pass

0
投票

将 JPEG 图像的文件大小减小到 50 KB 以下对于优化 Web 性能至关重要,尤其是对于 WTM 等平台。过大的图像会降低页面加载速度并影响用户体验。幸运的是,使用免费 JPEG 压缩实现这一点很简单。

该工具提供了一种无缝的方式来压缩图像而不影响质量。首先在网站上上传 JPEG 文件。系统会自动压缩映像,确保其满足 50 KB 或更小的所需大小阈值。先进的算法保持视觉清晰度,使其非常适合网络使用。

为了获得最佳效果,请使用平台的自定义功能,例如质量调整和分辨率设置。这些选项允许您微调图像,同时保持在尺寸限制以下。立即轻松压缩您的 JPEG 文件并增强您网站的性能!

使用免费 JPEG 压缩进行智能优化。

© www.soinside.com 2019 - 2024. All rights reserved.