2008-08-28 79 views
4

我有一个byte[]数组,其内容代表一个TIFF文件(如果我使用BinaryWriter对象直接将这些字节写出到一个文件中,它将形成一个完全有效的TIFF文件),并且我试图转向它变成为System.Drawing.Image对象,这样我可以用它来操纵以后(送入一个多页TIFF对象)如何获取TIFF图像的字节数组并将其转换为System.Drawing.Image对象?

我遇到的问题是,这一任务通常接受的代码:

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

回答

2

编辑:下面的假设是不正确的,我有机会稍后启动我的IDE和测试有和没有写,并且正确填充MemoryStream。

我想你需要先写信给你的MemeoryStream。

仿佛我的记忆中(没有双关语意)正确这符合我:

MemoryStream ms = new MemoryStream(byteArrayIn); 

创建一个大小的内存流。

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

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

看看是否能解决它。

+0

为了获得更好的性能,只需设置ms.Length和ms.Position,而不是再次调用ms.Write。 – 2011-05-28 16:41:59

3

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

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

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

此外,我发现一个简单的方法来从我的字节数组here构造一个多页TIFF。

1

所有这些都是帮助我找出问题的线索,问题与问题提出的问题相同。所以我想发布我的解决方案,因为这些有用的线索我到达了。感谢迄今发布的所有线索!

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

然后我的数据也是坏的T​​IFF数据,但在我的情况下,我有一个额外的字符13在我的图像数据的开始。一旦我删除了它,这一切都为我工作得很好。

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

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

谢谢Schnapple和蒂姆桑德斯!

相关问题