使用 Image.Save() 时出现 C# 通用 GDI+ 错误

标签 c# windows windows-xp gdi+ tiff

我是 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 中提取的图像列表?

我非常感谢任何人可以提供的任何帮助。

最佳答案

Hans Passant 的评论中有 2 条有用的信息。首先,TIFF 格式支持无数子类型和变体,但 GDI+ 并不支持所有这些子类型和变体。 其次,GDI+在XP之后得到了改进,但并不是到处都有。

您的代码可以在 Windows XP 和 Windows 7 上运行,但只能使用正确的输入 TIFF 文件。

我使用 .NET 2.0 和 .NET 4.0 程序以及 2 个输入文件对其进行了测试。第一个文件有 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 库来加载此类文件。

关于使用 Image.Save() 时出现 C# 通用 GDI+ 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28355389/

相关文章:

c - 在 Wininet 中使用 SSL

windows - 如何根据命令行参数在 Inno Setup 中提示重启?

vb.net - 使用 vb.net 将文件从 Windows XP 复制到 Linux

c++ - 如何使用 Visual Studio 2012 为 Windows XP 编译?

c# - Visual C#、Winforms 和部分类疯狂

windows - *Windows* 中的并行 Cucumber/Watir 场景

c# - 如何将 .NET Identity 与 HiQPdf 结合使用并呈现经过身份验证的 PDF

java - 绑定(bind)到地址的套接字无法连接到监听器,除非在 Win XP 上绑定(bind)到 127.0.0.1

c# - LINQ 计数字符外观

c# - 附加属性的 XML 文档注释放在哪里?