Python图像分辨率不变,压缩图像到固定大小

该博客介绍如何使用Python的PIL库压缩图像,保持分辨率不变,同时控制文件大小。通过调整保存图像时的质量参数(quality)和子采样(subsampling),实现对JPEG图像的优化压缩。提供了一个名为`compress_image`的函数,该函数根据设定的目标大小和步长逐步降低图像质量,直到满足文件大小要求。最后,示例代码展示了如何调用此函数并保存压缩后的图像。
摘要由CSDN通过智能技术生成

压缩图像

使用 Python压缩图像到固定大小,并保证分辨率不变
关键点:
使用 PIL 库,通过save函数调整图像质量,达到降低存储大小目的。
img.save(output_name, quality=quality)

  • quality参数: 保存图像的质量,值的范围从1(最差)到95(最佳)。 默认值为75,使用中应尽量避免高于95的值; 100会禁用部分JPEG压缩算法,并导致大文件图像质量几乎没有任何增益。
  • subsampling参数:子采样,通过实现色度信息的分辨率低于亮度信息来对图像进行编码的实践。 (参考:https://en.wikipedia.org/wiki/Chroma_subsampling)
    可能的子采样值是0,1和2,对应于4:4:4,4:2:2和4:1:1(或4:2:0?)。经过实践将值设为0便可以满足图片大小增大的需求。

函数说明:
以下方法的参数只针对于保存为JPG/JPEG格式的图片的情况。

from PIL import Image
import os

def get_size(filename):
    # Obtain the file size: KB
    size = os.path.getsize(filename)
    return size / 1024

def compress_image(img_path, out_path, mb=50, step=5, quality=100):
    """不改变图片尺寸压缩图像大小
    :param img_path: 压缩图像读取地址
    :param out_path: 压缩图像存储地址
    :param mb: 压缩目标,KB
    :param step: 每次调整的压缩比率
    :param quality: 初始压缩比率
    :return: 压缩文件地址,压缩文件大小
    """
    o_size = get_size(img_path)
    if o_size < mb:
        return Image.open(img_path)

    img = Image.open(img_path)

    while o_size > mb:
        img = Image.open(img_path)
        img = img.convert('RGB')
        img.save(out_path, quality=quality)
        if quality - step < 0:
            break
        quality -= step
        o_size = get_size(out_path)

    print('File size: ' + str(o_size))
    return img

if __name__ == '__main__':
    print("Compress image ...")
    img_path = 'test.png'
    out_path = 're.jpg' # 必须是 jpeg 类型
    img = compress_image(img_path, out_path)
    img.save('re2.jpg', quality=95) # 使用quality=95保证图像大小经过存储后不变
    print("Compress success!")
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值