【问题标题】:How can I take a byte array of a TIFF image and turn it into a System.Drawing.Image object?如何获取 TIFF 图像的字节数组并将其转换为 System.Drawing.Image 对象?
【发布时间】:2008-08-28 16:38:10
【问题描述】:

我有一个byte[] 数组,它的内容代表一个 TIFF 文件(例如,如果我使用 BinaryWriter 对象将这些字节直接写入文件,它会形成一个完全有效的 TIFF 文件)并且我'正在尝试将其转换为 System.Drawing.Image 对象,以便我可以将其用于以后的操作(输入多页 TIFF 对象)

我遇到的问题是这个任务普遍接受的代码:

    public Image byteArrayToImage(byte[] byteArrayIn)
    {
        MemoryStream ms = new MemoryStream(byteArrayIn);
        Image returnImage = Image.FromStream(ms, true);
        return returnImage;
    }

对我不起作用。上面调用Image.FromStream方法的方法的第二行在运行时死掉了,说

Parameter Not Valid

我相信该方法因这是一个 TIFF 文件这一事实而窒息,但我无法弄清楚如何使 FromStream 方法接受这一事实。

如何将 TIFF 图像的字节数组转换为 Image 对象?

另外,就像我说的那样,最终目标是拥有一个表示多页 TIFF 文件的字节数组,其中包含我现在拥有字节数组对象的 TIFF 文件。如果有更好的方法来做这件事,我完全赞成。

【问题讨论】:

    标签: c# .net image tiff


    【解决方案1】:

    好的,我发现了问题,它来自与我询问的代码部分无关的部分代码。数据作为字符串传递,我将其转换为字节数组(这是一个测试装置,所以我试图模拟我在主应用程序中获得的字节数组),然后将其转换为 MemoryStream,然后制作一张图片。

    我没有意识到字符串是 Base64 编码的。调用Convert.FromBase64String() 会导致它变成一个字节数组,不会杀死Image.FromStream() 方法。

    所以基本上它归结为我的一个愚蠢的错误。但是,嘿,上面的代码仍然有用,这个页面可能会作为谷歌的结果,告诉别人如何避免这个错误。

    另外,我发现了一种从我的字节数组 here 构造多页 TIFF 的简单方法。

    【讨论】:

      【解决方案2】:

      编辑:下面的假设不正确,我有机会稍后启动我的 IDE,并在使用和不使用 Write 的情况下进行了测试,并且都正确填充了 MemoryStream。

      我认为您需要先写入 MemeoryStream。

      好像我的记忆(没有双关语)正确地为我服务:

      MemoryStream ms = new MemoryStream(byteArrayIn);
      

      创建该大小的内存流。

      然后您需要将字节数组内容写入内存流:

      ms.Write(byteArrayIn, 0, byteArrayIn.Length);
      

      看看能不能解决问题。

      【讨论】:

      • 为了获得更好的性能,只需设置 ms.Length 和 ms.Position 而不是再次调用 ms.Write。
      【解决方案3】:

      所有这些都是帮助我找出问题的线索,这与问题所问的问题相同。因此,我想发布由于这些有用的线索而得出的解决方案。感谢迄今为止发布的所有线索!

      正如 Time Saunders 在他的回答中发布的那样,将字节实际写入内存流的 Write 方法是必不可少的。那是我的第一个错误。

      然后我的数据也是错误的 TIFF 数据,但在我的情况下,我的图像数据开头有一个额外的字符 13。一旦我删除它,它对我来说一切正常。

      当我阅读一些基本的 TIFF 文件格式规范时,我发现 TIFF 文件必须以 II 或 MM 开头(两个字节的值为 73 或 77)。 II 表示使用 little-endian 字节顺序(“Intel 字节顺序”)。 MM 表示使用大结尾(“摩托罗拉字节排序”)。接下来的两个字节是 42 二进制 101010 的两字节整数值(在 .NET 中 = Int16)。

      因此,正确的 TIFF 字节流以十进制字节值开头:73、73、42、0 或 77、77、0、42。我鼓励任何与我们遇到相同问题的人检查您的 TIFF 数据字节流式传输并确保您的数据是有效的 TIFF 数据!

      感谢 Schnapple 和 Tim Saunders!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-10-28
        • 2012-08-01
        • 2021-09-07
        • 1970-01-01
        • 1970-01-01
        • 2020-08-13
        • 1970-01-01
        相关资源
        最近更新 更多