使用 Image.Save() 时出现 C# Generic GDI+ 错误
Posted
技术标签:
【中文标题】使用 Image.Save() 时出现 C# Generic GDI+ 错误【英文标题】:C# Generic GDI+ Error when using Image.Save() 【发布时间】:2015-04-05 23:34:52 【问题描述】:我是 C# 成像的相对新手。这是我作为会员很长时间后在这个董事会上提出的第一个问题。我希望它能帮助我度过这个棘手的场景。
我需要读取多页 TIFF 的内容(帧),将每个内容保存到列表中,最后将其返回以进行处理。
这是我目前的代码
public static List<Image> GetAllPages(string file)
images = new List<Image>();
using (Image img = Image.FromFile(file))
try
for (int i = 0; i < img.GetFrameCount(FrameDimension.Page); i++)
img.SelectActiveFrame(FrameDimension.Page, i);
MemoryStream byteStream = new MemoryStream();
img.Save(byteStream, ImageFormat.Tiff);
images.Add(Image.FromStream(byteStream));
catch (Exception ex)
MessageBox.Show(ex.Message);
return images;
重要 - 在 Windows 7 上执行时,这实际上就像一个魅力。但是,在 Windows XP 上尝试同样的操作时,我得到了似乎众所周知的通用 GDI+ 错误。
我在这里有什么明显的遗漏吗?如果没有,是否有任何其他更有效的方法来返回从多页 tiff 中提取的图像列表?
任何人都可以提供任何帮助,我将不胜感激。
【问题讨论】:
XP 有一个旧版本的 GDI+,v1.00。您已经在 v1.10 上测试了您的代码,这是一个大大改进的版本。一切皆有可能,就像您忘记了 byteStream.Position = 0;有影响。对于特定的 TIFF,它是数千种不兼容文件格式的首字母缩写词。帮我们大家一个忙,停止支持 XP。 @HansPassant 我确实阅读了有关 GDI+ 版本方案的信息。我希望有人能够指出一些明显的错误。我很想停止支持 XP,但不幸的是,在这种特殊情况下,我不是做出这种选择的人。我会测试包括你建议的线路。 如果有其他人可以对此提供进一步的见解,而不是简单地告诉我(可能还有成千上万的人)停止支持 XP - 我将非常感激! @user3095888 检查您在保存文件的目录中是否有足够的用户权限,例如:如果在 c:\ 驱动器中,您将需要管理员权限。尝试使用相同的代码保存到另一个驱动器 【参考方案1】:Hans Passant 的评论中有 2 条有用的信息。首先,TIFF 格式支持无数子类型和变体,并非所有这些都受 GDI+ 支持。 其次,GDI+ 在 XP 之后得到了改进,但并非无处不在。
您的代码可以在 Windows XP 和 Windows 7 上运行,但只能使用正确的输入 TIFF 文件。
我使用带有 2 个输入文件的 .NET 2.0 和 .NET 4.0 程序对其进行了测试。第一个文件有 6 个页面,所有页面都使用 LZW 压缩进行编码。此文件适用于 Windows 7 和 XP。
第二个文件有 11 个页面,有 11 种不同的编码类型。在 Windows XP 上,11 个页面中只有 7 个页面被正确加载。 在 Windows 7 上,可以工作的页面更少,但特别是 JPEG 压缩可以正常工作,尽管它在 XP 下失败了。
Windows 8.1 的表现比两者都好,并成功地正确加载了 8 个页面。
您可以在此页面上找到文件以及使用的压缩类型列表: http://support.leadtools.com/CS/forums/44475/ShowPost.aspx
当然还有其他的 TIFF 子类型,其中大部分不被 GDI+ 原生支持,但这 11 种是比较常见的格式。
这给我们留下了让您的文件在 Windows XP 上运行的问题。由于它们可以在 Windows 7 上运行,因此您很有可能拥有适用于 Windows 7 但不适用于 XP 的 TIF 子类型,例如 JPEG 压缩。如果是这种情况,仅 .NET 是不够的,您可能必须使用专用的图像或 TIFF 库来加载此类文件。
【讨论】:
这很有帮助。非常感激。事实证明,问题在于文件的 JPEG 压缩 - XP/GDI1.0 似乎不喜欢那样。为了克服这个问题,至少在短期内,我安排了在通过我的应用程序之前使用 LZW 创建的文件。 使用 LZW 的另一个好处是,与 JPEG 不同,它是无损的,这意味着像素完整性不会因重复处理或保存而降低。但一个缺点是它生成的文件比大多数图像的 JPEG 更大。以上是关于使用 Image.Save() 时出现 C# Generic GDI+ 错误的主要内容,如果未能解决你的问题,请参考以下文章
为 C# 使用 swig 时出现 TypeInitializationException
C# - 为啥在使用 ReaderWriterLockSlim 时出现 LockRecursionException?
在 C# 中使用 TaskDialog 时出现 EntryPointNotFoundException