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

时间:2020-03-05 18:44:31  来源:igfitidea点击:

我有一个" 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()方法。

所以从根本上讲,这归结为我的一个愚蠢的错误。但是,上面的代码仍然有用,并且该页面可能会作为Google的结果,说明如何避免其他人犯此错误。

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