PNG压缩效果优于GIF,为何用PIL转换后PNG体积比GIF更大?
出现该现象的核心原因是你对两种格式的压缩优势认知存在适用场景偏差,具体可分为三点:
- 色深模式的默认差异
GIF最多仅支持8位色深(最多256种颜色),编码时采用索引色模式,单个像素仅占1字节。而PIL默认保存PNG时会保留原图的24位/32位真彩色模式,单个像素占3~4字节,哪怕图片实际颜色不足256种,默认模式下PNG的存储基数也远大于GIF,自然体积更高。 - 压缩参数未优化
PIL默认保存PNG的压缩等级为6(取值范围0~9,数值越高压缩率越高、耗时越长),你没有主动配置压缩参数,默认压缩率有限。而GIF采用的LZW压缩对低色彩复杂度的图片适配性更高,相同画质下体积更小。 - 动静态存储逻辑差异
你给出的GIF转换代码是将多张BMP拼接为动图,利用GIF的帧间压缩特性减少了重复内容的存储占用;而你转PNG时仅转换单张静态BMP,不存在帧间压缩的空间,也会进一步拉大两者的体积差。
优化方案
如果要得到体积小于GIF的PNG文件,可以先将图片转为和GIF一致的索引色模式,再开启最高压缩等级保存,示例代码如下:
from PIL import Image # 读取原BMP文件 img = Image.open("sample_1920×1280.bmp") # 转为8位索引色模式,自适应生成256色调色板 index_img = img.convert("P", palette=Image.ADAPTIVE, colors=256) # 最高压缩等级保存PNG index_img.save("sample1_compressed.png", compress_level=9)
内容的提问来源于stack exchange,提问作者Anup Pandey
相关产品推荐
相关产品推荐

