2017-06-06 15 views
0

私は、フォルダから複数のページのTIFFファイルのセットを取るために、フロントページを削除し、別の出力フォルダに同じ名前を使用して残りのページを保存する小さなプログラムを作成しようとしています。C#一般的なエラーGDI + SaveAdd

ファイルは出力フォルダに問題なく保存できますが、の2番目の文書のSaveAdd関数に到達すると、 "Generic Error Occurred GDI +"が表示されます。最初の文書(出力の7ページ)はすべてのページを正しく追加します。最初のページの後にページ/フレームを追加しようとすると、2番目のドキュメントが失敗します。私は様々なページ数で1番目と2番目の異なる文書を試しました。誰かが問題にどのような光を当てることができますか?

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'を実装しているため、処分する必要があります。あなたのコードはそれを漏らします。 'using'ブロックを使って、' Dispose'への呼び出しを振りかざすことを避けることを考えてください。処分する必要がある他のオブジェクトもあるかもしれません。漏れがないか慎重にコードを確認してください。 GDI +にエラーがあり、 'System.Drawing'名前空間がGDI +の大きなラッパーです。 –

+0

それを解決するために管理されます。 「32ビットの優先」チェックボックスのチェックを外しても問題は解決しなかったので、ループ内で何かがクリアされていない、またはトリガーされていないと思われていたことをもう一度繰り返しました。私はIDisposeを読んで始めました(少なくとも私は少なくとも1つの事を見なければならないたびに教えています!)、私はParamをループ外に設定していたことに気付きました。それを問題の中に置く。ポインタをありがとう:) – N1ghtwolf89

答えて

0

コメントは、正しく更新されていないエンコーダーパラメータに関して正しい方向を指摘しています。

問題が

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

は、ループの外にあるとしました。したがって、最初の文書は正しく動作しますが、2番目の文書は失敗します。

関連する問題