压缩c#中的现有TIFF文件

时间:2014-06-27 15:44:45

标签: c# tiff

我有数千个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);

非常感谢任何帮助!

1 个答案:

答案 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 +错误"坐在一个不舒服的椅子上。没有内部异常,也没有其他解释。