2017-04-18 24 views
-2

BigTiff(> 4 GB)イメージをサポートすると宣言されているように、LibTiff.Netライブラリを使用して1.5 GBのTiffファイルを読み書きしようとしましたファイル。私は以下のコードを書いたが、 "buffer [tiles] ..."という行にエラーが発生し、メモリ例外がスローされる。私はこの問題を解決するのに役立つ開発者に感謝します。LibTiff.Netを使用して1.5 GBタイルベースのTiffファイルを読み取る際のメモリ不足例外

using (Tiff input = Tiff.Open(@"E:\active folder\Sample_04.tif", "r")) 
     { 
      int width = input.GetField(TiffTag.IMAGEWIDTH)[0].ToInt(); 
      int height = input.GetField(TiffTag.IMAGELENGTH)[0].ToInt(); 
      int tileWidth = input.GetField(TiffTag.TILEWIDTH)[0].ToInt(); 
      int tileLentgh = input.GetField(TiffTag.TILELENGTH)[0].ToInt(); 

      int samplesPerPixel = input.GetField(TiffTag.SAMPLESPERPIXEL)[0].ToInt(); 
      int bitsPerSample = input.GetField(TiffTag.BITSPERSAMPLE)[0].ToInt(); 
      int photo = input.GetField(TiffTag.PHOTOMETRIC)[0].ToInt(); 

      int tiles = 0; 
      int tileSize = input.TileSize(); 
      byte[][] buffer = new byte[tileSize][]; 


      for (int y = 0; y < height; y += tileLentgh) 
      { 
       for (int x = 0; x < width; x += tileWidth) 
       { 
        buffer[tiles] = new byte[tileSize]; 
        input.ReadTile(buffer[tiles], 0, x, y, 0, 0); 
        tiles++; 
       } 
      } 

      // writing 
      using (Tiff output = Tiff.Open("output.tif", "w")) 
      { 

       output.SetField(TiffTag.SAMPLESPERPIXEL, samplesPerPixel); 
       output.SetField(TiffTag.IMAGEWIDTH, width); 
       output.SetField(TiffTag.IMAGELENGTH, height); 
       output.SetField(TiffTag.BITSPERSAMPLE, bitsPerSample); 
       output.SetField(TiffTag.ROWSPERSTRIP, output.DefaultStripSize(0)); 
       output.SetField(TiffTag.PHOTOMETRIC, photo); 
       output.SetField(TiffTag.PLANARCONFIG, PlanarConfig.CONTIG); 

       int c = 0; 

       for (int y = 0; y < height; y += tileLentgh) 
       { 
        for (int x = 0; x < width; x += tileWidth) 
        { 
         output.WriteTile(buffer[c], x, y, 0, 0); 
         c++; 
        } 
       } 
      } 
     } 
     System.Diagnostics.Process.Start("output.tif"); 
    } 
+2

32または64ビットプロセスですか? – stuartd

+0

これは32ビットプロセッサです。 –

+1

マシンにはどのくらいのRAMがありますか?どのくらいのスワップ/ページファイルスペースが設定され/使用可能になっていますか?例外がスローされたときにプロセスが消費するメモリ量 – DarkSquirrel42

答えて

1

問題はライブラリがBigTiffファイルをサポートしていないため、巨大な配列を割り当てるときにエラーがスローされます。あなたが書いたコードは、あなたのコンピュータのメモリに配列を割り当てようとしています。十分なスペースがあることを期待しています。そうでないようです。

ターゲットシステムの使用可能なメモリに匹敵するサイズのデータ​​を処理する常にが必要です(そのため、BigTiffのサポートはライブラリの説明で強調されています)。

幸いにも、これは新しい問題ではなく、解決策があります。hereまたはhereの回答を参照してください。

基本的に、これらのソリューションの背景にあるのは、ハードドライブ(または他のストレージデバイス)を使用してデータを保存し、必要なときに必要な部分をメモリにスワップするためのインターフェイスを提供することです(ちょうどvirtual memoryのように)。

+0

ありがとうございましたが、readTile()メソッドを使用して読み込むサンプルコードがないため、タイル貼りTiffを読み込むコードに疑念がありました。私は巨大なバッファ配列を扱うあなたの助言を取る。再度、感謝します! –

関連する問題