Win32 DIBでカラールックアップテーブルを使用する正しい方法は何ですか?

StackOverflow https://stackoverflow.com/questions/4648146

質問

16ビットDICOM画像でウィンドウレベリングを実行するコードを作成しています(これは16ビットDIBとしてメモリにロードされています)。私のウィンドウレベリングコードは完全であり、ルックアップテーブルを生成して、ソースピクセル値を目的の最終ピクセル値にマッピングすることで機能します。

私が確信していないのは、このルックアップテーブルを画像に適用する方法です。 bitmapinfoオブジェクトには、タイプrgbquad []の「bmicolors」にフィールドがあることがわかります。ルックアップテーブルをこのプロパティに割り当てようとしましたが、効果がないようです。また、SetDibColortable機能も試しましたが、画面の出力にも影響を与えないようです。

私がやろうとしていること(ピクセルデータ自体を変更するのではなく、塗装中にルックアップテーブルを適用しています)は、GDIでサポートされていますか、それとも実際にピクセルデータ自体を介してピクセル値を1つずつ変更する前にループすることになっていますか?

また、BITBLTまたはsetDibitStodevice関数を使用するかどうかにかかわらず、違いはないようです。彼らは両方ともここで同じように振る舞う傾向があります。

DirectXを使用することはオープンです。以前は使用したことがないので、回答として提供されている場合はサンプルコードがいいでしょう。

私のコードは非常にパフォーマンスが非常に重要であるため、より多くの努力/コードが含まれている場合でも、これを達成するための最速の方法を探しています。

役に立ちましたか?

解決

カラーテーブルは、8 bpp以下のビットマップにのみ使用されるため、GDIは16-bpp画像でそれらを無視します。

(テーブルには、バイトでインデックス付けされた最大256色を持つことができます。)

(技術的には、テーブルは、どの色が最も重要であるかを指定するためにまだ使用される場合がありますが、それはあなたを助けません。それが最近何でも使用されているかどうかはわかりません。)

また、GDIはインデックス付き色モードでの作業が信頼できないことを発見したので、お勧めしません。

(ここで私の質問を参照してくださいが、それはあなたがやっているのと同じことではありませんが、これについてGDIに頼ることを先送りにするはずです。それは16-bppまたは32-bppからインデックス付き色に変換すること、そしてGDIが行う際の問題についてそれは正確に: GDIは、正確なパレットでインデックス付き色への変換に失敗しますか? - また、そこにリンクされているコードは、いくつかのインデックス付き色のビットマップをセットアップするため、便利な場合がありますが、とにかく16 bppデータを使用してドイーンに適用されるとは思いません。)

あなたがしていることについては、STD :: MAPのようなものを、ある色からもう1つの色に変換するための高速ルックアップテーブルとしてマップを使用して、自分でビットマップデータを直接変更することをお勧めします。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top