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

Why does saving image on C# Bitmap give different file size than original?

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

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

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

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

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