【问题标题】:Generating TIFF with C# produces different files on different machines使用 C# 生成 TIFF 在不同的机器上生成不同的文件
【发布时间】:2014-08-20 15:10:14
【问题描述】:

我正在使用以下代码来测试创建位图并将其保存为 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));
}

关于为什么会发生这种情况的任何想法?

【问题讨论】:

  • 单机是否一致?因为 TIFF 格式为can contain a timestamp。 (对不起,如果这是一个愚蠢的问题:))
  • @Rawling:是的,哈希值是一致的。谢谢。
  • 两台机器上的.NET Framework版本一样吗?
  • @user3643376:是的,框架版本是一样的。
  • 我想建议尝试检查编解码器属性:msdn.microsoft.com/it-it/library/…

标签: c# .net gdi+ tiff


【解决方案1】:

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

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

【讨论】:

  • FWIW,在视网膜 macbook 和 windows 8.1 上,我得到 7A-F7-...-FE 哈希。我在控制面板中使用非标准字体大小。
  • 哇,真的很有趣。当我将显示字体切换回标准设置时,我能够重现并获得 0D-5D 散列。我想知道是否有任何方法可以从文件中删除该信息,但同时我认为这回答了我的问题。谢谢!
  • 好收获!会不会只是因为字体大小的改变而改变了 TIFF 中的 DPI 设置?
【解决方案2】:

System.Drawing 命名空间中的大多数 .NET 类都依赖于非托管 GDI+ 运行时。

自 Windows XP 以来的每个 Windows 操作系统都附带不同版本的 GDI+。这些版本在解码或编码图像时通常会产生不同的结果。 特别是 TIFF 图像。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-29
    • 2013-05-02
    • 1970-01-01
    • 2020-02-12
    • 2021-12-31
    • 1970-01-01
    • 2010-12-10
    相关资源
    最近更新 更多