除非我使用Image.FromFile,否则Image.SelectActiveFrame为何在多页TIFF的最后一帧上失败(“ GDI +中发生一般错误”)?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了除非我使用Image.FromFile,否则Image.SelectActiveFrame为何在多页TIFF的最后一帧上失败(“ GDI +中发生一般错误”)?相关的知识,希望对你有一定的参考价值。
我正在调用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图像。 (...
以上是关于除非我使用Image.FromFile,否则Image.SelectActiveFrame为何在多页TIFF的最后一帧上失败(“ GDI +中发生一般错误”)?的主要内容,如果未能解决你的问题,请参考以下文章
Image.FromFile 是不是为无效的图像格式抛出 OutOfMemoryException 的原因?
Image.FromFile() 或 FromStream() 在 GdiplusStartup 上挂起
System.Drawing.GDIPlus.CheckStatus System.Drawing.Image.FromFile System.ArgumentException [GDI + sta