2011-02-10 22 views
4

.NETで大きなTIFF画像を切り抜く方法を見つけようとしています。具体的には、ジオリファレンス情報を埋め込むことができるTIFFであるGeoTiffでこの操作を実行しようとしています。このタイプのデータセットに精通していない人にとっては、TIFF 6.0に完全に準拠しており、通常はサイズが大きくなります。ギガバイトの範囲で何度も。画像をメモリに読み込まないで大きなTIFF画像.NETを切り抜く

私はこのタスクを達成するために、System.Windows.Media.Imaging名前空間を使いこなしてきました。しかし、切り取られるTIFFファイルのサイズは、メモリ不足エラーを引き起こします。私は、入力画像をオンセットでメモリに読み込まずに画像をトリミングする方法を示す情報を誰かに教えてもらえますか?

FYI - GDALがこのタスクに対応できる以上のことを十分に認識しています。しかし、不必要な詳細に陥ることなく、私のアプリでGDALをデプロイすることは、いくつかの理由から現時点では選択肢ではないため、ネイティブの.NETクラスでこれを行うことを希望します。しかし、使用できる他のサードパーティの.NETライブラリがあれば、私はすべて耳にします。

+0

http://stackoverflow.com/questions/9004149/open-huge-tif-in-net-and-copy-parts-to-new-image/9009999#9009999 私はこれに従ってください私の問題を解決回答。 – Cryeyes

答えて

3

libtiffをご覧ください。スキャンライン(またはイメージがフォーマットされている場合はストリップ)でイメージをロードします。明らかに、スキャンライン(またはストリップ)全体を保持するのに十分なメモリが必要ですが、画像全体をメモリにロードするよりも実行可能です。

.NET version of the libraryと思われ、無料でオープンソースのようです(他のアプリとは異なります)。

+0

また、一部のTIFF画像では、タイルベースのエンコーディングが使用されます。タイルベースのエンコーディングは、タイルのコンテンツのみがフルストリップではなくデコードできるため、ストリップよりも非常に大きな次元の画像の方が効率的です。 Libtiffは、ストリップやタイルレベルでの作業がかなり簡単ですが、それでもTIFFコンテナの構造に少し慣れていても問題ありません。 [TIFF 6.0仕様](http://partners.adobe.com/public/developer/tiff/index.html)を参照してください。 – allonym

1

は残念ながら、System.DrawingSystem.Drawing.Imaging内で利用可能な組み込みのGDI +ベースのイメージング操作は、(完全なイメージがある時点でメモリにロードされている必要があります。これはあなたの状況では明らかに現実的ではありません。

1

ない方法あなたはありませんギガバイトの範囲のTIFFを「イメージ」と見なすべきである:ディスク上のファイルとして扱うか、メモリにマップし、データセットのように操作する。

イメージング名前空間は設計されていないTIFF操作ライブラリを見つけたり、独自のルーチンを作成したりする必要がありますファイルレベルで作業します。過去に私が協力してきたオープンソースのCベースのライブラリ「libtiff」があります。それは良い出発点になる可能性があります。

(TIFFファイルにはあらゆる種類の圧縮が可能ですが、ジオテクチャであれば標準/直接圧縮があるのか​​、圧縮されていないのでしょうか?仕事のほとんど - それはTIFFのディレクトリとエントリを保存しています。商用オプションの後にAtalasoftのDotImageライブラリを見てみることをお勧めします)

関連する問題