Bitmap.SetResolution在保存时创建不准确的值

时间:2017-04-20 11:39:57

标签: c# .net bitmap resolution

我正在开发一个程序来检查目录中的所有PNG图像以获得正确的分辨率并重置不正确的分辨率。对于每个不正确的文件,我使用下面的代码重置其分辨率。

float ppi = 96.0F;
string absolutePath = "...";
[...]
FileStream fs = new FileStream(absolutePath, FileMode.Open);
Image image = Image.FromStream(fs);
fs.Close();
if (image != null)
{
    Bitmap bitmap = new Bitmap(image);
    bitmap.SetResolution(ppi, ppi);
    bitmap.Save(absolutePath, System.Drawing.Imaging.ImageFormat.Png);
}

当我在保存后从位图变量(bitmap.Horizo​​ntalResolution,bitmap.VerticalResolution)读取分辨率信息时,它们打印出来是正确的(96)。

但是当我重新启动程序时,相同的文件显示为错误。现在所有分辨率都设置为95,9866。之前有许多不同的价值观。

我已经尝试将SetResolution的ppi转换为整数,但没有成功。

我是否犯了任何错误,或者这是文件格式的问题?有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

正如Hans Passant指出的那样,由于文件格式中的英制和单位单位之间的转换,无法准确设置分辨率。所以我找到了一种完全删除它的方法:

Ken Silverman的工具PNGOUT.exe用于优化PNG图像,从而删除所有显式DPI信息。移除后,WPF会将图像的分辨率视为默认的96 DPI分辨率。如果图像与其原始测量一起使用,则不需要缩放 - 这也可能改善UI的性能。但性能影响还有待测试。