2017-06-06 39 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); 

是循環外。因此,第一個文件正常工作,但第二個文件失敗。

相關問題