2012-05-17 11 views
6

PixelFormat.Format24bppRgbエンコーディングで巨大な画像(aprox 24000 x 22000)を作成する必要があります。私はC#で巨大な画像を生成する

私は何をしようとしていることはこれです...それはほとんど不可能それを開くようになります知っている:私は11ギガバイトのファイルを扱うことができないとして、例外がスローされ期待されるように

Bitmap final = new Bitmap(width, height, PixelFormat.Format24bppRgb); 

そう簡単にメモリ。

しかし、私はアイデアを持っていました。それを生成しているときにファイルを書き込めますか?だから、RAMで作業するのではなく、私はHDで作業するだろう。

私は約13Kのタイルを持っています。私はこのばかげた巨大なファイルで一緒にステッチする予定です。私はそれらを与えられた順序で反復することができるので、安全でないコードを使用してメモリに直接書き込むことができます。

提案がありますか?

+0

アンマネージコードの代わりに、安全でないコードを参照してください。 –

+4

[メモリマップファイル](http://msdn.microsoft.com/en-us/library/dd997372.aspx)を参照してください。 – GSerg

+1

@GSergメモリマップされたファイル_can_大きなファイルからセクションを開く/編集するのに使用できますが、**は推奨されていません**これらの大きなファイルをメモリマップファイルに作成します!!! –

答えて

2

BMPのような非圧縮形式で書くことができます。 BMPは生のカラーバイトを行に保存します。したがって、タイルの最初の行を読み込み、別々のピクセル行を読み込んで、出力イメージに複合単一行として書き込みます。この方法では、タイルを少ししか開いておらず、即座に出力イメージを書き留めることができます。

しかし、JPGやPNGのように圧縮されたイメージとして書き込む方法はわかりません。しかし、私はそれに特化したソフトウェアがあると確信しています。

+0

私はあなたのアイデアを得ましたが、良いアプローチですが、問題があります:システムがそのような大きなファイルを処理できるかどうかをBitmapクラスがチェックするので、新しいBitmap()から渡されることはありません。 –

+1

ここで重要な点は、画像操作のためのビルド中のクラスは使用しないでください。あなたは生のままにすべきです。だから私が言ったように、複雑な圧縮アルゴリズムなしで書くことができる、非常に単純な生のイメージフォーマットであるBMPを使用してください。 – Euphoric

+0

ええと...今私はそれを得た。それは確かに良いアイデアです!私は試してみましょう!ありがとう! –

0

完了時にこの画像で行う予定に応じて、4に分割してその方法で作業することをおすすめします。 OOM例外がスローされることなく10,000 x 10,000ピクセルで作業しました。

+0

今はまさに私がやっていることですが、これは有効な回避策ですが、このファイルの作成に急いではありませんので、私は問題のアプローチを研究しています! –

+0

FWIW、私はそれが8192 x 8192ピクセル以下にとどまるほうがはるかに安全だと感じます。特に、一度に複数のテクスチャをメモリに保持する場合(たとえば、あるものから別のものにコピーする場合)。 – ToolmakerSteve

3

ImageMagickのLarge Image Support(テラピクセル)は、それを構成するタイルがあれば、画像をまとめておくのに役立ちます。コマンドラインを使用して、thisラッパーを使用してコマンドラインを使用するか、このImageMagick.NETをAPIとして使用することができます。

+0

有望そうですね!私はこのAPIを見ていきます!ありがとう! –

+0

ImageMagikのバージョンが更新されました。NET http://magick.codeplex.com/ – Jonathan

+0

ImageMagick.NETへのリンクありがとうございます - 私は以前気づいていませんでした。 – ToolmakerSteve

関連する問題