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



我在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;
}

重要-当在Windows7上执行时,这实际上就像一个魅力。然而,当在WindowsXP上尝试同样的操作时,我会得到一个众所周知的通用GDI+错误。

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

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

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

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

我使用.NET 2.0和.NET 4.0程序对它进行了测试,并使用了2个输入文件。第一个文件有6个页面,所有页面都是用LZW压缩编码的。这个文件在Windows7和XP上都可以使用。

第二个文件有11页,有11种不同类型的编码。在WindowsXP上,11个页面中只有7个页面加载正确。在Windows7上,工作的页面更少,但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库来加载此类文件。

最新更新