Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从磁盘读取png文件并将其保存回后,文件大小会增加_C#_Image Processing_Png - Fatal编程技术网

C# 从磁盘读取png文件并将其保存回后,文件大小会增加

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

我目前正在开发一个小程序,从磁盘读取png文件,做一些修改并保存回来。除了一个小问题外,一切都很顺利,在我将文件保存回磁盘后,它的大小总是增加,例如,一个27.1MB的文件将变成33.3MB

经过一些调试后,我最终将其范围缩小到我的阅读和保存代码。这是我当前使用的代码:

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)
这两个因素将极大地影响输出图像文件的大小。过滤是经验性的,您可以对所有图像行使用四分之一的过滤算法,或对不同的行使用不同的算法,甚至可以在单独的行上自适应地尝试不同的算法,并选择最大的压缩率。对于大多数图像作者来说,自适应方式是最耗时和不切实际的

滤波后,图像数据被压缩。deflate算法的压缩级别通常在0-9之间,从最低压缩率到最高压缩率。压缩率越高,压缩过程越慢。通常,对于大多数图像,4是最好的

过滤过程在PNG压缩过程中起着非常重要的作用。不同的滤波算法可能导致保存的图像大小存在较大差异。另一方面,图像大小对压缩级别不太敏感

您可以使用诸如TweakPNG之类的工具来检查图像包含的颜色深度和通道数。如果原始图像和重新保存的图像具有相同的颜色深度和通道,则过滤和压缩级别很可能是导致文件大小增加的罪魁祸首


事实是,如果编码器没有优化,文件大小往往会增加。不过,如果你不介意对生成的图像进行后处理,那么还有很多PNG优化软件。

如果你使用C#程序重新读取相同的PNG,是否也会发生这种情况?如果没有,则可能与PNG压缩级别有关(您使用的代码压缩更少,绘制压缩更多)。如果我重新读取相同保存的PNG,则其大小不再增加。此解决方案将图像从PNG转换为jpeg,而我需要PNG格式的文件。如果我将EncoderInfo更改为“image/png”,那么设置压缩并不重要,我仍然得到了一个稍微膨胀的图像。第三个因素是文件是否使用了不合适的颜色类型写入,例如将灰度图像写入truecolor,或者甚至为不透明图像写入alpha通道,浪费了文件大小。许多应用程序都会这样做。事实上,透明度是原因。我在这个链接中使用了代码,但将“红色”替换为“透明”,我的问题似乎得到了解决。感谢@gzup为我们提供适合您的解决方案。我不是这样;我编写的代码专门用于删除png图像上的alpha通道。同样的在白色背景上粘贴并在没有alpha通道操作的情况下重新保存给了我一个117k的Gimp png文件和一个145k的c#png文件。