C# 从磁盘读取png文件并将其保存回后,文件大小会增加
我目前正在开发一个小程序,从磁盘读取png文件,做一些修改并保存回来。除了一个小问题外,一切都很顺利,在我将文件保存回磁盘后,它的大小总是增加,例如,一个27.1MB的文件将变成33.3MB 经过一些调试后,我最终将其范围缩小到我的阅读和保存代码。这是我当前使用的代码:C# 从磁盘读取png文件并将其保存回后,文件大小会增加,c#,image-processing,png,C#,Image Processing,Png,我目前正在开发一个小程序,从磁盘读取png文件,做一些修改并保存回来。除了一个小问题外,一切都很顺利,在我将文件保存回磁盘后,它的大小总是增加,例如,一个27.1MB的文件将变成33.3MB 经过一些调试后,我最终将其范围缩小到我的阅读和保存代码。这是我当前使用的代码: Bitmap img = new Bitmap(<path to file>); //omitted img.Save(<path to new file>, ImageFormat.Png); Bit
Bitmap img = new Bitmap(<path to file>);
//omitted
img.Save(<path to new file>, ImageFormat.Png);
Bitmap img=新位图();
//省略
保存(,ImageFormat.Png);
我已经验证过,无论我是否进行任何修改,只要读取并保存图像,它的大小就会发生变化。此外,如果我用Paint打开保存的文件并从那里保存,文件将收缩回原始大小
如何在不改变图像大小的情况下读取和保存图像?我认为您缺少了压缩部分。
像这样添加到代码中-
Bitmap img = new Bitmap(<path to file>);
img.Save(<path to file>, myImageCodecInfo, myEncoderParameters);
像这样储蓄-
Bitmap img = new Bitmap(<path to file>);
img.Save(<path to file>, myImageCodecInfo, myEncoderParameters);
img.Save(,myImageCodeInfo,myEncoderParameters);
这里是链接。希望能有帮助。你试过玩Endoder.ColorDepth场吗?PNG还支持透明度,可能会保存一些图像不需要的信息
ImageCodecInfo pngCodec = ImageCodecInfo.GetImageEncoders().Where(codec => codec.FormatID.Equals(ImageFormat.Png.Guid)).FirstOrDefault();
if (pngCodec != null)
{
EncoderParameters parameters = new EncoderParameters();
parameters.Param[0] = new EncoderParameter(Encoder.ColorDepth, 24); //8, 16, 24, 32 (base on your format)
image.Save(stream, pngCodec, parameters);
}
此处的附加信息:除了颜色深度和使用的通道数(w/o alpha)外,保存的PNG文件大小主要取决于两个因素:
- 如何对图像行进行预处理(称为过滤)
- deflate算法的压缩级别(0-9)
事实是,如果编码器没有优化,文件大小往往会增加。不过,如果你不介意对生成的图像进行后处理,那么还有很多PNG优化软件。如果你使用C#程序重新读取相同的PNG,是否也会发生这种情况?如果没有,则可能与PNG压缩级别有关(您使用的代码压缩更少,绘制压缩更多)。如果我重新读取相同保存的PNG,则其大小不再增加。此解决方案将图像从PNG转换为jpeg,而我需要PNG格式的文件。如果我将EncoderInfo更改为“image/png”,那么设置压缩并不重要,我仍然得到了一个稍微膨胀的图像。第三个因素是文件是否使用了不合适的颜色类型写入,例如将灰度图像写入truecolor,或者甚至为不透明图像写入alpha通道,浪费了文件大小。许多应用程序都会这样做。事实上,透明度是原因。我在这个链接中使用了代码,但将“红色”替换为“透明”,我的问题似乎得到了解决。感谢@gzup为我们提供适合您的解决方案。我不是这样;我编写的代码专门用于删除png图像上的alpha通道。同样的在白色背景上粘贴并在没有alpha通道操作的情况下重新保存给了我一个117k的Gimp png文件和一个145k的c#png文件。