2012-01-25 114 views
13

大きなTIFFファイルのセクションを開いたりコピーしたりできるライブラリを探しています。私はファイルを非常に迅速に開くLibTiff.Netを見てきましたが、画像のセクションを切り取ったりコピーしたりする機能はありません。私のイメージは100,000 x 100,000ピクセル上にあり、そのサイズのSystem.Drawing.Bitmapを作成するとアプリケーションがクラッシュするので、Bitmapに変換するのはオプションではありません。.NETで巨大なTIFを開き、新しいイメージに部品をコピーする

誰でも.NETライブラリを推薦できますか?

+0

ああ、それは40 *ギガバイトです。私はそれが余分に挑戦するために32ビットのオペレーティングシステムしか持っていないと思いますか? –

+0

私は64ビットハードウェアで動作していますが、ディスクから読み込むことが理想的な方法です。私はLibTiff.Netを深く探していますが、私が必要とする可能性のあるスキャンラインを読む機能があります – JWood

+0

イメージの色、グレースケールまたは2レベルですか?バイレベルのために、私はメモリの問題を解決できるネイティブコードソリューションを持っています。私に電子メールを送ってください([email protected])。 – BitBank

答えて

5

ファイルがのディスクのより4GB未満の場合は、LibTiff.Netをもう一度ご覧ください。このような大きな画像でも、いくつかの選択肢があります。

まず、画像がタイル貼りされているかどうかを確認してください。 Tiff.IsTiledメソッドは答えを提供します。

画像がタイル化されている場合は、おそらくReadScanlineメソッドを使用して読み取るべきではありません。その場合はReadEncodedTileメソッドを使用する方が良いかもしれません。

画像が削除された場合は、ReadScanlineおよびReadEncodedStripの方法を使用して読み取ることができます。

System.Drawing.Bitmapが必要なものを使用する場合は、ReadRGBATileまたはReadRGBAStripを試してみてください。これらのメソッドを使用すると、イメージの一部からビットマップを作成できます。これに関するサンプルはありませんが、Convert color TIFF to a 32-bit System.Drawing.Bitmapは、画像のタイルまたはストリップをビットマップに変換する方法に関するほとんどすべての必要な情報を提供します。

EDIT:4GBを超えるファイルもサポートされるように

LibTiff.Net 2.4.508はBigTiffのためのサポートを追加します。

+0

JPG圧縮されたタイル画像があります。私はイメージにアクセスしてそれを書き戻したい。 ReadEncodedTileで読み込み、WriteTileまたはWriteEncodedTileで書き込むのですか? – Krip

+0

私はReadEncodedTileとそれに続くWriteEncodedTileで作業しました。 – Krip

4

通常のTIFFは4 GBを超えることはできないため、画像はBigTIFF形式である必要があります。

BigTIFFはlibtiff(BigTIFF websiteで利用可能)の改訂版で読むことができます。このライブラリは、メモリ内のすべてのピクセルデータをロードせずに、そのようなイメージを処理することを可能にします。

.NET用のバインディングは見当たりませんでしたが、それを行うには余りにも長すぎるべきではありません。

0

Atalasoft dotImageは、この能力をTIFFデコーダに内蔵しています。デコードではインターフェイスIRegionReadableが実装されています。このインターフェイスを使用すると、ストリーム内の画像の特定のページから長方形のセクションを読み取ることができます。

TIFFでは、このセクションでオリエンテーションタグを尊重し、ストリップされたタイルまたはタイルされたティフでは、タイルとストリップの最小セットを使用して矩形を塗りつぶします。

(免責事項、私はAtalasoftのために働くとそのインターフェイスを書いて、TIFFデコーダでそれを実装)

+0

dotImageを使って、倍率を使ってTIFFファイルを開くことは可能ですか?たとえば1/2または1/4としましょう。だから、大規模なTIFFファイルのサムネイルをすばやく生成するには?大規模なTIFFファイルのメタデータをどのくらい速く更新できますか? –

+0

これは、一般的なケースでは、タイリングや画像の向きの複雑さのために不可能です。しかし、IScaledDecoderインターフェイスを実装して画像を拡大して読み取ることができるようにするには、これらのほとんどを考慮に入れています。最悪の場合は変わらないものの、最善のケースが得られます。メタデータの更新に関して、あなたは何がすばらしいですか?これはIOバウンドプロセスです。それは私が期待するだけでなく、うまくいくようです。 – plinth

+0

この機能を追加する際にお知らせください。これが私の現在のTIFF処理ライブラリから別のものに切り替えることができる唯一の理由です。 –

0

Bobrovskyは、ファイルの画像がタイル張りであるかどうかをチェックすべきで述べたように。以下では、ストリームtiffを読み込んで画像の左上部分をトリミングするスニペットコードを示しました。

using (Tiff input = Tiff.Open(@"imageFile.tif", "r")) 
     { 
      // get properties to use in writing output image file 
      int width = input.GetField(TiffTag.IMAGEWIDTH)[0].ToInt(); 
      int height = input.GetField(TiffTag.IMAGELENGTH)[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 scanlineSize = input.ScanlineSize();  
      byte[][] buffer = new byte[height][]; 
      for (int i = 0; i < height; ++i) 
      { 
       buffer[i] = new byte[scanlineSize]; 
       input.ReadScanline(buffer[i], i); 
      } 



      using (Tiff output = Tiff.Open("splitedImage.tif", "w")) 
      { 
       output.SetField(TiffTag.SAMPLESPERPIXEL, samplesPerPixel); 
       output.SetField(TiffTag.IMAGEWIDTH, width/2); 
       output.SetField(TiffTag.IMAGELENGTH, height/2); 
       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; 
       byte[][] holder = new byte[height][]; 

       for (int i = height/2; i < height; i++) 
       //for (int j = 0; j < height/2 ; j++) 
       { 
        holder[i] = buffer[i].Skip(buffer[i].Length/2).ToArray(); 

        output.WriteScanline(holder[i], c); 
        c++; 
       } 
      } 
     } 

     System.Diagnostics.Process.Start("splitedImage.tif"); 

イメージの他の部分については、forループの "i"の範囲を変更できます。

関連する問題