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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 15:24:03