使用PIL的Image.fromarray保存图片后体积大幅缩小,求原因及解决办法
问题:PIL Image.fromarray转存JPG后体积大幅减小的原因与解决办法
原因分析
核心问题出在PIL保存JPG时的默认压缩参数与原始图片不一致:
- 原始JPG大概率采用了更高的质量参数(比如90以上)压缩,而PIL的
Image.save()方法保存JPG时,默认quality参数为75,这个参数会显著提高压缩比,直接导致文件体积缩小。 - 从numpy数组转回Image对象时,像素数据本身无丢失,但保存过程中默认的编码配置(如采样率、优化选项)和原始图片的编码参数存在差异,也会加剧体积变化。
解决办法
要让转存后的图片体积和原始图片接近,只需在保存时显式指定匹配的质量参数即可:
匹配原始图片质量参数:
先读取原始JPG的质量信息,再用相同参数保存:from PIL import Image import numpy as np img = Image.open('this.jpg') # 获取原始图片的JPG质量,无记录则用默认75 orig_quality = img.info.get('quality', 75) arrayA = np.array(img) new_img = Image.fromarray(arrayA) # 用原始质量参数保存 new_img.save('this_changed.jpg', quality=orig_quality, optimize=True)直接指定高质量参数:
若不需要严格匹配原始质量,直接设置较高的quality值(比如90-95),既能让体积接近原始文件,也能保证画质:new_img.save('this_changed.jpg', quality=95, optimize=True)
补充说明
quality参数范围为1-95,数值越高画质越好、体积越大;超过95会开启无压缩模式,体积会大幅飙升。optimize=True会让PIL优化JPG编码逻辑,在不损失画质的前提下尽可能压缩体积,或在相同体积下提升画质。
内容的提问来源于stack exchange,提问作者brownmunde
相关产品推荐
相关产品推荐

