除非我使用Image.FromFile,否则Image.SelectActiveFrame为何在多页TIFF的最后一帧上失败(“ GDI +中发生一般错误”)?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了除非我使用Image.FromFile,否则Image.SelectActiveFrame为何在多页TIFF的最后一帧上失败(“ GDI +中发生一般错误”)?相关的知识,希望对你有一定的参考价值。

Related SO Answer(这是为什么??]

我正在调用Web服务(我无权访问其源代码),该服务正在返回给我一个字节数组,该字节数组应该表示多页TIFF图像。 (方法名称已更改以保留就业机会...)

var tiffBytes = _webServiceClient.GetTiff("someIdentifier");

如果我使用标准FileStream将tiffBytes写入文件,然后在知道TIFF是什么的情况下打开生成的文件,那没有问题,我可以正确浏览页面。当直接从该文件(Image.FromFile(...))创建Image对象时,其余代码也没有问题。这使我相信tiffBytes中存储的字节实际上是有效的。

如果我将tiffBytes写到MemoryStream,事情会变得很奇怪:

//Note that this code works just fine if I create "img" with Image.FromFile() var frameCount = img.GetFrameCount(FrameDimension.Page); // frameCount = 2 img.SelectActiveFrame(FrameDimension.Page, 0); // First frame selected with no issue img.SelectActiveFrame(FrameDimension.Page, 1); // Exception: "A generic error occured in GDI+"

我认为我创建的MemoryStream不正确,但是我确实不认为自己是。我尝试了几种不同的方法来获得相同的结果。生成的Image对象将显示并正常运行,直到我尝试移至最后一页:

方法1:

using(var ms = new MemoryStream(tiffBytes)) img = Image.FromStream(ms);

方法2:

using(var ms = new MemoryStream(tiffBytes.Length)) ms.Write(tiffBytes, 0, tiffBytes.Length); img = Image.FromStream(ms);

所以...我的问题是,为什么Image.FromFile()和Image.FromStream()之间的差异会使TIFF的最后一页/帧在加载时导致异常?

侧问题...是否可以访问某种win32 api来查看该异常到底是什么?

相关SO答案(这是为什么??),我正在调用一个Web服务(我无权访问其源代码),该Web服务正在向我返回一个字节数组,该字节数组应该表示多页TIFF图像。 (...

答案
Hans Passant的评论很有用,但我没有找到完整的解决方案。

以上是关于除非我使用Image.FromFile,否则Image.SelectActiveFrame为何在多页TIFF的最后一帧上失败(“ GDI +中发生一般错误”)?的主要内容,如果未能解决你的问题,请参考以下文章

使用 c# 进行高质量 JPEG 压缩

Image.FromFile 方法锁住文件解决方法

Image.FromFile 是不是为无效的图像格式抛出 OutOfMemoryException 的原因?

Image.FromFile() 或 FromStream() 在 GdiplusStartup 上挂起

System.Drawing.GDIPlus.CheckStatus System.Drawing.Image.FromFile System.ArgumentException [GDI + sta

C# 相对路径