c# - 用C#生成TIFF在不同的机器上会产生不同的文件

标签 c# .net gdi+ tiff

我正在使用以下代码来测试创建位图并将其保存为 TIFF 文件。该代码运行良好,但在我的一台计算机上,生成的 TIFF 生成的 MD5 哈希值与我运行该代码的其他几台计算机上的 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));
}

关于为什么会发生这种情况有什么想法吗?

最佳答案

TIFF 文件可以存储大量数据和图像信息。

我能够在两台不同的机器上运行您的 LinqPad 程序,并且都返回 0D-5D 哈希值。 然后,我可以通过更改“控制面板”>“显示”中的字体大小设置,在一台计算机上重现 MD5 哈希值。当我的字体设置为标准大小时,我得到了 0D-5D 哈希值;当我将字体设置为 125% 时,我得到了 7A-F7 哈希值。我猜测“CPU 1”上的字体大小设置为 125%,并且 .NET 必须在 TIFF 文件中编码此信息。

关于c# - 用C#生成TIFF在不同的机器上会产生不同的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25408336/

相关文章:

c# - 如何拼接很少重叠的图像?

c# - 我可以在没有这些工件的情况下使用 graphics.RotateTransform() 吗?

c# - 格式化组合框的文本,C#

c# - 具有多个列表的列表<> c#

c# - 在真实和虚拟串行端口之间创建一对

c# - 为什么加载包含值类型字段的类会强制 CLR 加载该值类型?

.net - 理解byref、ref和&

c++ - 缓存位图

c# - WPF 样式,创建要在 XAML 中跨应用程序使用的样式页面

c# - C#中List的内部工作