6

我有一个byte[]数组,它的内容代表一个 TIFF 文件(例如,如果我使用该对象将这些字节直接写到一个文件中BinaryWriter,它会形成一个完全有效的 TIFF 文件),我正试图将它变成一个系统.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 文件。如果有更好的方法来做这件事,我完全赞成。

4

3 回答 3

3

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

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

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

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

于 2008-08-28T18:58:10.257 回答
2

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

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

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

MemoryStream ms = new MemoryStream(byteArrayIn);

创建该大小的内存流。

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

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

看看能不能解决。

于 2008-08-28T17:15:42.530 回答
1

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

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

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

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

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

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

于 2014-02-17T20:10:15.710 回答