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

问题描述:

我是一个相对的新手,在C#中进行图像处理。这是我在成为会员很长时间后在这个董事会上的第一个问题。我希望它能帮助我解决这个棘手的情况。C#通用GDI +使用Image.Save时出错()

我需要读取多页TIFF的内容(帧),将每一个保存到一个List中,最后返回它然后做一些工作。

继承人到目前为止我的代码

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相同的,当我得到了seemedly众所周知通用GDI实际工作就像一个魅力+错误。

有什么明显的我在这里失踪?如果没有,是否还有其他更有效的方式来返回从多页Tiff中提取的图像列表?

我将不胜感激任何人都可以给的帮助。

+3

XP有一个旧版本的GDI +,v1.00。您已经在v1.10上测试过您的代码,这是一个大大改进的版本。任何事情都是可能的,就像你忘记了byteStream.Position = 0;有一个影响。对于特定的TIFF,它是成千上万不兼容文件格式的首字母缩写。请大家帮忙,停止支持XP。 – 2015-02-05 22:47:02

+0

@HansPassant我读过关于GDI +版本的情况。我希望有人能够指出一些明显的错误。我很乐意停止支持XP,但不幸的是,在这种特殊情况下,我不是那种做出这种选择的人。 我会测试包括你建议的线路。 – user3095888 2015-02-05 23:08:49

+0

如果其他人可以提供一些进一步的见解,而不是简单地告诉我(可能有成千上万的人)停止支持XP - 我会非常感激! – user3095888 2015-02-08 17:04:27

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上工作的TIF子类型,但不是XP,比如JPEG压缩。如果是这种情况,仅使用.NET是不够的,您可能不得不使用专用的映像或TIFF库来加载这些文件。

+0

这非常有帮助。非常感激。事实证明,问题在于JPEG压缩文件--XP/GDI1.0似乎不喜欢那样。为了解决这个问题,至少在短期内,我会先安排使用LZW创建的文件,然后再通过我的应用。 – user3095888 2015-02-14 15:46:44

+0

使用LZW的好处是,与JPEG不同,它是无损的,这意味着像素完整性不会因重复处理或保存而降低。但是有一个缺点就是它在大多数图像上产生比JPEG大的文件。 – 2015-02-18 21:43:34