You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用PIL的Image.fromarray保存图片后体积大幅缩小,求原因及解决办法

问题:PIL Image.fromarray转存JPG后体积大幅减小的原因与解决办法

原因分析

核心问题出在PIL保存JPG时的默认压缩参数与原始图片不一致:

  • 原始JPG大概率采用了更高的质量参数(比如90以上)压缩,而PIL的Image.save()方法保存JPG时,默认quality参数为75,这个参数会显著提高压缩比,直接导致文件体积缩小。
  • 从numpy数组转回Image对象时,像素数据本身无丢失,但保存过程中默认的编码配置(如采样率、优化选项)和原始图片的编码参数存在差异,也会加剧体积变化。

解决办法

要让转存后的图片体积和原始图片接近,只需在保存时显式指定匹配的质量参数即可:

  1. 匹配原始图片质量参数:
    先读取原始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)
    
  2. 直接指定高质量参数:
    若不需要严格匹配原始质量,直接设置较高的quality值(比如90-95),既能让体积接近原始文件,也能保证画质:

    new_img.save('this_changed.jpg', quality=95, optimize=True)
    

补充说明

  • quality参数范围为1-95,数值越高画质越好、体积越大;超过95会开启无压缩模式,体积会大幅飙升。
  • optimize=True会让PIL优化JPG编码逻辑,在不损失画质的前提下尽可能压缩体积,或在相同体积下提升画质。

内容的提问来源于stack exchange,提问作者brownmunde

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 08:35:31