如何获取 TIFF 图像的字节数组并将其转换为 System.Drawing.Image 对象?

StackOverflow https://stackoverflow.com/questions/32750

  •  09-06-2019
  •  | 
  •  

我有一个 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 文件。如果有更好的方法来做到这一点,我完全赞成。

有帮助吗?

解决方案

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

我认为你需要先写入你的 MemeoryStream 。

好像我的记忆(没有双关语)正确地告诉了我:

MemoryStream ms = new MemoryStream(byteArrayIn);

创建该大小的内存流。

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

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

看看是否能解决问题。

其他提示

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

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

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

另外,我找到了一种从字节数组构造多页 TIFF 的简单方法 这里.

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

正如 Time Saunders 在他的回答中所发表的那样,将字节实际写入内存流的 Write 方法至关重要。这是我的第一个错误。

然后我的数据也是坏的 TIFF 数据,但就我而言,我的图像数据开头有一个额外的字符 13。一旦我删除了它,一切对我来说都很好。

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

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

谢谢施纳普尔和蒂姆桑德斯!

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top