2017-06-06 68 views
0

我试图创建一个小程序,从文件夹中取一组多页TIFF文件,删除首页并使用相同名称将其余页面保存到单独的输出文件夹。保存添加的C#通用错误GDI +

这些文件可以保存到输出文件夹而没有问题,但是当它到达第二个文档上的SaveAdd功能时,我会收到“GDI +中发生的通用错误”。第一个文档(输出7页)正确添加所有页面。尝试在初始页面之后添加其他页面/帧时,第二个文档失败。我尝试了不同的文档,第一页和第二页的页数各不相同。任何人都可以解决这个问题?

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Threading.Tasks; 
using System.Drawing; 
using System.Drawing.Imaging; 
using System.IO; 

namespace FrontPageRemover 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Image frame; 
      int pages; 
      string fileName; 

      string folderPath = @"TIFF\Tiff Files"; 
      string[] files = Directory.GetFiles(folderPath); 
      Image image; 

      Encoder encoder = Encoder.SaveFlag; 
      ImageCodecInfo encoderInfo = ImageCodecInfo.GetImageEncoders().First(i => i.MimeType == "image/tiff"); 
      EncoderParameters encoderParams = new EncoderParameters(1); 
      encoderParams.Param[0] = new EncoderParameter(encoder, (long)EncoderValue.MultiFrame); 

      foreach (string file in files) 
      { 
       image = Image.FromFile(file); 
       pages = image.GetFrameCount(FrameDimension.Page); 
       image.SelectActiveFrame(FrameDimension.Page, 1); 

       fileName = Path.GetFileName(file); 
       image.Save(@"TIFF\Files Out\" + fileName, encoderInfo, encoderParams); 

       for (int index = 2; index < pages; index++) 
       { 
        image.SelectActiveFrame(FrameDimension.Page, index); 
        encoderParams.Param[0] = new EncoderParameter(encoder, (long)EncoderValue.FrameDimensionPage); 
        image.SaveAdd(encoderParams);      
       } 

       encoderParams.Param[0] = new EncoderParameter(encoder, (long)EncoderValue.Flush); 
       image.SaveAdd(encoderParams); 
       image.Dispose(); 
      } 

     } 
    } 
} 
+0

'EncoderParameter'类实现'IDisposable',因此应该被丢弃。你的代码泄漏了它。考虑使用'使用'块来保存自己不必在整个过程中将呼叫拨到'Dispose'。还可能有其他物品需要处置。仔细检查您的代码是否有泄漏。对于什么是值得的,当* GDI +出现错误时,你总是*得到这个错误信息,'System.Drawing'命名空间是GDI +的一个大包装。 –

+0

管理解决它。取消勾选“prefer 32-bit”复选框没有修复,因此它重新迭代了我已经假定某些内容未在循环中清除或触发的内容。我开始阅读IDispose(我是自学的,所以每次我编码时我需要至少查看一件东西!),并意识到我在环路外设置了Param。把它放在固定的问题。感谢指针:) – N1ghtwolf89

回答

0

评论指出我在正确的方向关于EncoderParameters不更新/正在处理。

问题同

encoderParams.Param[0] = new EncoderParameter(encoder, (long)EncoderValue.MultiFrame); 

是循环外。因此,第一个文件正常工作,但第二个文件失败。

相关问题