为什么在C#位图上保存图像的文件大小与原始图像不同?

时间:2015-10-16 12:32:34

标签: c# image bitmap

我目前正在开发一个项目,修改一些图像并再次保存。但是,我注意到,在文件大小(以字节为单位)方面,有时结果图像与原始图像截然不同。即使修改非常小,例如改变单个像素的颜色。所以我决定做这个实验,我加载一个图像并立即将它再次保存到新文件而不做任何更改(使用C#Bitmap类)。我希望在两个文件中都能获得相同的大小,但遗憾的是实际大小并不相同。这是我的代码:

String originalImagePath = "image.png";
String savedImagePath = "image2.png";
Bitmap image = new Bitmap(originalImagePath);
image.Save(savedImagePath);

Assert.AreEqual(new FileInfo(originalImagePath).Length, new FileInfo(savedImagePath).Length);

Assert.AreEqual failed. 
Expected:<218144>.Actual:<344264>.

这两个文件的大小是否相同?如果没有,那么我在这里缺少什么?
我怎样才能生成相同的文件?
这是我正在使用的图像: PNG Image

1 个答案:

答案 0 :(得分:3)

这真的没什么奇怪的。您正在保存PNG文件,该文件仅真正定义了文件应该如何解码,而不是如何进行实际压缩。不同的应用程序可以通过具有不同的压缩表来生成截然不同的文件大小。通常还可以进行一些调整(例如,限制文件的调色板,或在编码/解码速度和文件大小之间选择)。

通过使用PNG Gauntlet等工具可以非常清楚地看到这一点,该工具在输入时获取PNG文件,并生成逐像素的相同图像,只需大幅减小文件大小(通常减少约30%的空间) ,但我看到的结果减少了70%)。

当然,最后,即使其他条件相同,位图中的微小变化也会导致文件显着增加。也许你已经打破了一些特别容易压缩的模式。也许你不能再适合8位调色板了。也许您已经添加了透明渠道。还有更多。