我目前正在开发一个小程序来从磁盘读取png文件,进行一些修改并将其保存回来。一切都运行顺利,除了一个小问题,在我将文件保存回磁盘后,它的大小总是增加,例如,一个27.1MB的文件将变成33.3MB。
经过一些调试后,我最终将其缩小到我的阅读和保存代码。这是我目前正在使用的代码:
Bitmap img = new Bitmap(<path to file>);
//omitted
img.Save(<path to new file>, ImageFormat.Png);
我已经验证无论是否进行任何修改,只需阅读并保存图像就会导致图像大小发生变化。此外,如果我用Paint打开保存的文件并从那里保存,文件将缩小回原始大小。
如何在不改变图像尺寸的情况下阅读和保存图像?
答案 0 :(得分:1)
除了颜色深度和使用的通道数(不含alpha)外,保存的PNG文件大小主要取决于两个因素:
这两个因素将极大地影响输出图像文件的大小。过滤是经验性的,您可以使用四分之一过滤算法用于所有图像线或不同算法用于不同线路,甚至可以在各个线路上自适应地尝试不同的算法并选择最大的压缩率。对于大多数图像编写者来说,自适应方式是最耗时且不实用的。
过滤后,图像数据被压缩。 deflate算法的压缩级别通常为0-9,从低到最高压缩率。压缩率越高,压缩过程越慢。通常4对于大多数图像来说是最好的。
过滤过程在PNG压缩过程中起着非常重要的作用。不同的滤波算法可能导致保存的图像大小差异很大。另一方面,图像大小对压缩级别不太敏感。
您可以使用TweakPNG等工具检查图像所包含的颜色深度和通道数。如果原始图像和重新保存的图像具有相同的颜色深度和通道,那么过滤和压缩级别很可能是增加文件大小的罪魁祸首。
事实是,如果编码器未经过优化,通常情况下,文件大小会增加。但是,如果您不介意对结果图像进行后期处理,那么会有很多PNG优化软件。
答案 1 :(得分:0)
我认为你错过了压缩部分 添加到您的代码 -
Bitmap img = new Bitmap(<path to file>);
这是你错过的 -
ImageCodecInfo myImageCodecInfo = GetEncoderInfo("image/jpeg");
EncoderParameter myEncoderParameter = new EncoderParameter(Encoder.Quality, 25L);
EncoderParameters myEncoderParameters.Param[0] = myEncoderParameter;
并像这样保存 -
img.Save(<path to file>, myImageCodecInfo, myEncoderParameters);
以下是MSDN链接。希望它有所帮助。
答案 2 :(得分:0)
您是否尝试过使用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);
}
此处的其他信息:https://msdn.microsoft.com/en-us/library/system.drawing.imaging.encoder.colordepth(v=vs.110).aspx