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

时间:2008-08-28 16:38:11

标签: c# .net image tiff

我有一个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文件。如果有更好的方法可以做到这一点,我会全力以赴。

3 个答案:

答案 0 :(得分:3)

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

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

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

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

答案 1 :(得分:2)

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

我认为你需要先写信给你的MemeoryStream。

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

MemoryStream ms = new MemoryStream(byteArrayIn);

创建该大小的内存流。

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

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

看看是否能解决问题。

答案 2 :(得分:1)

所有这些都是帮助我找出问题的线索,问题与问题相同。因此,我希望发布我的解决方案,因为这些有用的线索。感谢到目前为止发布的所有线索!

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

然后我的数据也是糟糕的TIFF数据,但在我的情况下,我在图像数据的开头有一个额外的字符13。一旦我删除了它,这对我来说都很好。

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

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

感谢Schnapple和Tim Saunders !!