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