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中提取的图像列表?
我将不胜感激任何人都可以给的帮助。
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库来加载这些文件。
这非常有帮助。非常感激。事实证明,问题在于JPEG压缩文件--XP/GDI1.0似乎不喜欢那样。为了解决这个问题,至少在短期内,我会先安排使用LZW创建的文件,然后再通过我的应用。 – user3095888 2015-02-14 15:46:44
使用LZW的好处是,与JPEG不同,它是无损的,这意味着像素完整性不会因重复处理或保存而降低。但是有一个缺点就是它在大多数图像上产生比JPEG大的文件。 – 2015-02-18 21:43:34
XP有一个旧版本的GDI +,v1.00。您已经在v1.10上测试过您的代码,这是一个大大改进的版本。任何事情都是可能的,就像你忘记了byteStream.Position = 0;有一个影响。对于特定的TIFF,它是成千上万不兼容文件格式的首字母缩写。请大家帮忙,停止支持XP。 – 2015-02-05 22:47:02
@HansPassant我读过关于GDI +版本的情况。我希望有人能够指出一些明显的错误。我很乐意停止支持XP,但不幸的是,在这种特殊情况下,我不是那种做出这种选择的人。 我会测试包括你建议的线路。 – user3095888 2015-02-05 23:08:49
如果其他人可以提供一些进一步的见解,而不是简单地告诉我(可能有成千上万的人)停止支持XP - 我会非常感激! – user3095888 2015-02-08 17:04:27