我有数千个TIFF文件都是32MB因为没有添加压缩。我需要运行它们并使用LZW压缩每个。为了快速实现这一点,我只压缩单页TIFF文件,这些文件大部分都是。
运行时出现Generic GDI +错误。但是,如果我在保存时使用不同的文件名,那么它可以正常工作。
DirectoryInfo d = new DirectoryInfo(@"D:\Data\lzwtest");
FileInfo[] Files = d.GetFiles("*.tif");
foreach (FileInfo file in Files)
{
Bitmap image1 = (Bitmap)Image.FromFile(file.FullName);
int tiffpages = image1.GetFrameCount(System.Drawing.Imaging.FrameDimension.Page);
if (tiffpages == 1)
{
image1.Save(@"D:\Data\lzwtest\" + file.Name, myImageCodecInfo, myEncoderParameters);
}
}
如果我将image1.Save行更改为以下内容,则可以正常工作(只需在文件名的前面添加" test - "
image1.Save(@"D:\Data\lzwtest\test-" + file.Name, myImageCodecInfo, myEncoderParameters);
非常感谢任何帮助!
答案 0 :(得分:3)
您需要为位图使用中间存储。
DirectoryInfo d = new DirectoryInfo(@"D:\Data\lzwtest");
FileInfo[] Files = d.GetFiles("*.tif");
foreach (FileInfo file in Files)
{
using(MemoryStream ms = new MemoryStream(File.ReadAllBytes(file)))
{
Bitmap image1 = (Bitmap)Image.FromStream(ms);
int tiffpages = image1.GetFrameCount(System.Drawing.Imaging.FrameDimension.Page);
if (tiffpages == 1)
{
image1.Save(@"D:\Data\lzwtest\" + file.Name, myImageCodecInfo, myEncoderParameters);
}
}
}
问题是GDI +锁定了位图的来源,无论它是真正的文件还是流。在这种情况下,我们不关心MemoryStream是否被锁定。
我希望GDI的开发人员能够为这个" Generic GDI +错误"坐在一个不舒服的椅子上。没有内部异常,也没有其他解释。