使用 Image.Save() 时出现 C# 通用 GDI+ 错误
C# Generic GDI+ Error when using Image.Save()
我是 C# 成像方面的相对新手。这是我成为董事会成员很长时间后在这个董事会上提出的第一个问题。我希望它能帮助我度过这个棘手的场景。
我需要读取多页 TIFF 的内容(帧),将每一个保存到一个列表中,最后 return 对其进行一些处理。
这是我目前的代码
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+ 错误。
这里有什么明显的遗漏吗?如果没有,是否还有其他更有效的方法来 return 从多页 tiff 中提取图像列表?
如果有人能提供任何帮助,我将不胜感激。
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 上工作,所以很有可能你有一个 TIF 子类型在 Windows 7 上工作但在 XP 上不工作,例如 JPEG 压缩。如果是这种情况,单靠 .NET 是不够的,您可能必须使用专用图像或 TIFF 库来加载此类文件。
我是 C# 成像方面的相对新手。这是我成为董事会成员很长时间后在这个董事会上提出的第一个问题。我希望它能帮助我度过这个棘手的场景。
我需要读取多页 TIFF 的内容(帧),将每一个保存到一个列表中,最后 return 对其进行一些处理。
这是我目前的代码
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+ 错误。
这里有什么明显的遗漏吗?如果没有,是否还有其他更有效的方法来 return 从多页 tiff 中提取图像列表?
如果有人能提供任何帮助,我将不胜感激。
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 上工作,所以很有可能你有一个 TIF 子类型在 Windows 7 上工作但在 XP 上不工作,例如 JPEG 压缩。如果是这种情况,单靠 .NET 是不够的,您可能必须使用专用图像或 TIFF 库来加载此类文件。