我正在使用以下代码测试创建位图并将其另存为TIFF文件。代码工作正常,但在我的一台计算机上生成的TIFF产生的MD5哈希值与我运行代码的其他几台计算机不同。所有计算机上的图像都相同,但由于某种原因,文件略有不同。使用十六进制编辑器进行检查,看起来页脚中的差异仅为4个字节。我使用LinqPad执行下面的代码。结果如下:
CPU 1 (Windows 7) Hash: 7A-F7-F4-C5-1A-02-10-D5-FC-C9-40-A1-4F-18-D7-FE
Others (Windows 7/8) Hash: 0D-5D-23-58-2F-DE-D5-B3-CB-73-31-E1-37-CF-32-3C
这是测试代码:
void Main()
{
using(var bmp = new Bitmap(100, 100))
{
using(var g = Graphics.FromImage(bmp))
{
g.FillRectangle(Brushes.Blue, 10, 10, 80, 80);
}
using(var ms = new MemoryStream())
{
SaveBitmapAsTIFFToStream(ms, bmp);
ms.Position = 0;
var provider = new MD5CryptoServiceProvider();
string hash = BitConverter.ToString(provider.ComputeHash(ms));
Console.WriteLine(hash);
}
}
}
public static void SaveBitmapAsTIFFToStream(Stream stream, Bitmap b)
{
b.Save(stream, FindEncoder(ImageFormat.Tiff), null);
}
private static ImageCodecInfo FindEncoder(ImageFormat fmt)
{
return ImageCodecInfo.GetImageEncoders()
.FirstOrDefault(info1 => info1.FormatID.Equals(fmt.Guid));
}
关于为什么会发生这种情况的任何想法?
答案 0 :(得分:5)
TIFF文件可以存储大量数据和图像信息。
我能够在两台不同的机器上运行你的LinqPad程序,并且都返回了0D-5D哈希。 然后,我可以通过更改控制面板>中找到的字体大小设置,在一台计算机上重现MD5哈希值。显示。当我的字体设置为标准尺寸时,我得到了0D-5D哈希,当我将字体设置为125%时,我得到了7A-F7哈希。我猜测" CPU 1"的字体大小。设置为125%,并且.NET必须在TIFF文件中对此信息进行编码。
答案 1 :(得分:0)
System.Drawing
命名空间中的大多数.NET类都依赖于非托管GDI +运行时。
自Windows XP以来,每个Windows操作系统都附带不同版本的GDI +。这些版本在解码或编码图像时通常会产生不同的结果。 特别是 TIFF图像。