使用PIL调整缩放后PNG图片质量无效,如何通过quality参数减小文件大小?
解决PNG图片调整quality参数无效的问题
兄弟,我懂你这种摸不着头脑的感觉!问题出在PNG和JPEG的本质差异以及你对quality参数的理解上,咱们一步步理清楚:
核心原因:PNG是无损压缩格式
PNG本身设计为无损压缩,它的quality参数(在绝大多数图像处理库里,比如Pillow)和JPEG的quality完全不是一回事:
- JPEG的
quality是控制有损压缩的程度:值越低,丢弃的图像数据越多,文件体积越小,画质越差。 - PNG的
quality(如果支持的话)是控制无损压缩的效率:比如Pillow里PNG的quality对应压缩级别(0-9,0最快、压缩率最低;9最慢、压缩率最高),但无论怎么调,它都不会损失图像画质,所以文件大小变化可能极小,甚至完全没变化——这就是你改了参数却没效果的原因!
而且你原始图片是JPEG,转成PNG后相当于把有损的JPEG数据转成了无损存储,这时候再调PNG的quality自然不会让文件变小。
针对需求的解决方案
根据你的目标(降低画质+减小文件大小),分两种情况处理:
情况1:不需要保留PNG格式(推荐)
既然原始是JPEG,直接保留JPEG格式调整quality就能达到你要的效果,这才是正确的打开方式:
from PIL import Image # 打开原始JPEG图片 img = Image.open("original.jpg") # 保存为低质量JPEG,quality范围1-100,值越小文件越小、画质越差 img.save("output_low_quality.jpg", quality=30)
情况2:必须使用PNG格式
如果一定要用PNG,要通过减少图像颜色信息或优化无损压缩参数来减小体积:
方法1:转成索引颜色模式(有损压缩PNG)
把真彩色PNG转成256色的索引模式,会大幅减小文件大小(代价是损失部分颜色细节):
from PIL import Image img = Image.open("original.jpg") # 转换为自适应256色的索引模式 img = img.convert("P", palette=Image.ADAPTIVE, colors=256) # 开启优化+最高压缩级别 img.save("output_small_png.png", optimize=True, compress_level=9)
方法2:优化真彩色PNG的压缩率
如果要保留真彩色,调整PNG的compress_level参数(1-9,9是最高压缩率,速度最慢):
from PIL import Image img = Image.open("original.jpg") # 保存时设置最高压缩级别 img.save("output_compressed_png.png", compress_level=9)
内容的提问来源于stack exchange,提问作者Ossama
相关产品推荐
相关产品推荐

