Python 压缩图像

Posted 安果移不动

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python 压缩图像相关的知识,希望对你有一定的参考价值。

import os

from PIL import Image, ImageFile
from PIL.Image import Resampling


def main():
    # 压缩单张图片
    outfile = r'X:\\原件.jpg'  # 单张图片地址

    # 复制出来一个压缩文件
    outfile_copy = outfile.replace('.jpg', '_压缩后的文件.jpg').replace('.png', '_压缩后的文件.png')
    if os.path.exists(outfile_copy):
        os.remove(outfile_copy)
    os.system('copy  '.format(outfile, outfile_copy))

    compress_image(outfile_copy,mb=1000)

    pass


# 压缩图片文件
def compress_image(outfile, mb=100, quality=85, k=0.9):  # 通常你只需要修改mb大小
    """不改变图片尺寸压缩到指定大小
    :param outfile: 压缩文件保存地址
    :param mb: 压缩目标,KB
    :param k: 每次调整的压缩比率
    :param quality: 初始压缩比率
    :return: 压缩文件地址,压缩文件大小
    """

    o_size = os.path.getsize(outfile) // 1024  # 函数返回为字节,除1024转为kb(1kb = 1024 bit)
    print('before_size: after_size:'.format(o_size, mb))
    if o_size <= mb:
        return outfile

    ImageFile.LOAD_TRUNCATED_IMAGES = True  # 防止图像被截断而报错

    while o_size > mb:
        im = Image.open(outfile)
        x, y = im.size
        out = im.resize((int(x * k), int(y * k)), Resampling.LANCZOS)  # 最后一个参数设置可以提高图片转换后的质量
        try:
            out.save(outfile, quality=quality)  # quality为保存的质量,从1(最差)到95(最好),此时为85
        except Exception as e:
            print(e)
            break
        o_size = os.path.getsize(outfile) // 1024


if __name__ == '__main__':
    main()

以上是关于Python 压缩图像的主要内容,如果未能解决你的问题,请参考以下文章

9. matlab图像处理基础——JPEG压缩+类型转换

C# 将多个图片合并成TIFF文件的两种方法(续集)

获取图像的压缩比

使用比率时在 Interface Builder 中发出平衡约束

6.3RLE算法的缺点

矩阵SVD奇异值分解用于图像压缩