2009-08-19 18 views
1

Delphi 7ではかなり大きな24bppビットマップ(数百MB)を処理する必要があります。 Graphic32ライブラリを使用して処理したいので、32bpp(TBitmap32)に変換する必要があります。 TBitmap32のLoadFromFileメソッドは、元の24bppビットマップをロードする一時的な従来のTBitmapを作成し、必要なフォーマット変換を行うためにTBitmap32に割り当てられます。もちろん、これらの巨大なビットマップのうちの2つをメモリに格納することで、メモリの負荷は約2倍になります。これはアプリケーションにとって致命的なことになります。24bppビットマップから32bppへの変換

私が考えているのは、32bppのビットマップが収まるような大きさの事前割り当てバッファに24bppビットマップをロードする方法です。バッファの終わりから、RGBバイトをオフセットは32bppに必要です。

これは可能ですか?あらかじめ割り当てられたバッファにビットマップをロードするにはどうすればよいですか?何か案が?

+0

これがなぜあなたのアプリケーションにとって致命的なのかを明確にすることはできますか?少しのメモリページングで少しのパフォーマンス低下が見られるかもしれませんが、なぜそれは致命的ですか? – jpfollenius

+0

@Ken:彼はコピーを避けたい。大きなバッファを1回だけ割り当て、バッファに(より小さい)24bppビットマップを読み込み、すべての変換をその場で実行します。 – jpfollenius

答えて

0

Graphics32の仕組みはあまり分かりません。しかし、標準のファイル形式を使用し、TBitmap32ピクセルデータに直接アクセスできる場合は、読み込みを行う形式の独自のイメージローダを作成し、32bppへのアップコンバートを1つの方法で作成することができます。

一般的なファイル形式の仕様は、インターネット上で公開されていますが、どれを使用していますか?

+0

そうです、それはうまくいくでしょう。しかし、この解決策は私が期待したものではありません(おそらく私の記述が十分にはっきりしていない...) 私の入力ファイルは通常24bppのWindows BMPファイルですが、圧縮ファイルなどの他のBMPファイルは除外できません。この場合、自分ですべてのデコードなどをしなければならないでしょう。 BMPを事前に割り当てられたバッファに読み込むことを許可するAPI関数はないので、ピクセル行列はすでに利用可能です。 –

関連する問題