使用Image.Save()时C#Generic GDI +错误

时间:2015-02-05 22:35:31

标签: 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上尝试相同时,我得到了一个众所周知的Generic GDI +错误。

我有什么明显的遗失吗?如果没有,是否还有其他更有效的方法来返回从多页tiff中提取的图像列表?

我非常感谢任何人都可以给予帮助。

1 个答案:

答案 0 :(得分:1)

Hans Passant在评论中有两个有用的信息。首先,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的TIF子类型,而不是像JPEG压缩那样的XP。如果是这种情况,仅使用.NET是不够的,您可能必须使用专用的成像或TIFF库来加载这些文件。