2009-06-19 3 views
6

C#で大きな画像(20,000x20,000ピクセル)を処理する必要があります。これらの画像を直接開くことはメモリの制限のために行く方法ではありませんが、私がしたいのは画像を小さな部分に分割することです(クロッピング)。私はそのトリックができるサードパーティ製のライブラリを探していましたが、今のところ結果はありません。 FreeImageとImageMagickを試しましたが、20,000x20x000ピクセルの画像を開くことはできません。どうすればこれを達成できますか?巨大画像を切り抜くには

+1

画像はどのような形式ですか?ビットマップのようなフォーマットでは、ファイルioを直接使うことができます。 GDIなどを使用する場合は、個々のチャンクをストリームに変換してイメージにロードします)。 PNGのような形式では、PNGファイルをブロックに分割して直接処理する方法を詳しく調べる必要があります。 – Brian

答えて

3

現在の私の現在のプロジェクトは、16GBを超えるイメージをロードできる画像ビューア/解析プログラムで構成されています。手動のファイルIOを使用し、ヘッダ情報を取り出し、必要に応じてサブイメージを作成する必要があります(イメージを処理している場合は、単一のタイルを作成してその場で処理できます)。非常に少数のライブラリが、20k×20kの画像(24bppで1.2GB)を読み込み/変更する機能を提供するライブラリはほとんどありませんし、パフォーマンスに似ているものではほとんどそうすることはありません(それが懸念される場合)。

+0

16GB +の画像ですか?それは素晴らしいです、彼らはどこから来ていますか? –

+0

私たちは非常に巨大な画像を生成することができる合成開口レーダー画像を扱います:P –

+0

hah、thats badass(googleには素晴らしい画像がいくつかあります)、どの言語を使用していますか?私はC#がその種のワークロードを処理できるかどうか不思議です –

0

私はこれを行うための既存のライブラリが分かりません。

おそらく、画像ファイルストリームを開けて、色とピクセルデータが存在する場所に移動し、ピクセルデータのセクションを配列に読み込んでそこから画像を作成する必要があります。

たとえば、BMP file formatの場合は、カラーテーブルを検索し、カラーテーブルを読み込んだ後、ピクセル配列セクションに移動し、希望する多くのpixesを配列にロードしてから、新しいビットマップを作成しますそれらのピクセルだけで

0

私はImageMagickでやっています。非常に堅実な.NET APIがあり、通常はこのような画像処理を行うための最良の方法です。

ページの下にある.NETの部分を見てください。

http://www.imagemagick.org/script/api.php

ここでのImageMagickでの作物のものはコマンドライン版のために、どのように機能するかについての情報です。あなたはビルトインの.NETライブラリを使用することができます

http://www.imagemagick.org/Usage/crop/#crop

0

使用メモリにキャッシュされた画像データを停止します

sourceBitmap = (Bitmap)Image.FromStream(sourceFileStream, false, false);

。あなたはその巨大な画像のサブセクションを描画する新しいデスティネーションビットマップを作成することができますdestRectはoutputImage全体の大きさ、または小さい領域とすることができる

var output = new Bitmap(outputWidth, outputHeight); 
var outputGraphics = Graphics.FromImage(output); 

outputGraphics.DrawImage(sourceBitmap, destRect, srcRect, GraphicsUnit.Pixel); 

using (var fs = File.OpenWrite(outputFilePath)) 
{ 
    output.Save(fs, System.Drawing.Imaging.ImageFormat.Png); 
} 

関連する問題