System.Drawing.Image保存PNG后体积增大如何保留原文件大小
问题原因
System.Drawing.Image加载PNG文件时会默认将图像解码为32位ARGB格式,忽略原文件的色深、压缩参数配置;直接调用无参数Save()方法时,会使用默认PNG编码参数,未启用最高压缩等级,也不会保留原文件的索引色/低位深配置,最终导致输出文件体积大幅上涨。
解决方案
方案1:指定PNG最高压缩等级(无损画质)
首先获取PNG专属编码器,手动设置最高压缩等级后再保存,不会损失任何画质,可最大程度缩小输出体积,示例代码如下:
var imagePath = @"C:\Users\test.png"; var savePath = @"C:\Users\result.png"; // 用using包裹自动释放Image对象,避免内存泄漏 using Image image = Image.FromFile(imagePath); // 获取系统PNG编码器 ImageCodecInfo pngCodec = ImageCodecInfo.GetImageEncoders() .First(codec => codec.FormatID == ImageFormat.Png.Guid); // 配置压缩参数,PNG采用LZW无损压缩,最高压缩等级对应参数如下 EncoderParameters encoderParams = new EncoderParameters(1); encoderParams.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Compression, (long)EncoderValue.CompressionLZW); // 传入编码器和参数保存 image.Save(savePath, pngCodec, encoderParams);
方案2:保留原图像色深配置
如果原PNG是8位索引色或更低位深的格式,仅设置压缩等级可能还是会输出32位色文件,可额外添加色深配置参数,和原文件色深保持一致即可,比如原文件为8位色,可在EncoderParameters中追加配置:
// 追加色深参数,数值和原文件色深保持一致即可 encoderParams.Param[1] = new EncoderParameter(System.Drawing.Imaging.Encoder.ColorDepth, 8L);
注意事项
- PNG为无损压缩格式,调整压缩等级仅会改变保存时的CPU耗时,不会对最终画质产生任何影响
- 部分原PNG可能使用了第三方工具的专属压缩优化,内置编码器压缩后可能和原体积有微小差异,属于正常情况
内容的提问来源于stack exchange,提问作者Quang Huy Hoang
相关产品推荐
相关产品推荐

