0

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

よくわからないのは、このルックアップ テーブルを画像に適用する方法です。BITMAPINFO オブジェクトには、RGBQUAD[] タイプの「bmiColors」フィールドがあることがわかります。ルックアップ テーブルをこのプロパティに割り当てようとしましたが、効果がないようです。SetDIBColorTable 関数も試してみましたが、画面出力には何の影響もないようです。

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

また、BitBlt 関数を使用するか SetDIBitsToDevice 関数を使用するかに違いはないようです。ここではどちらも同じように振る舞う傾向があります。

私が望むものを達成するのがより簡単であれば、私は DirectX を使用することにオープンです。私は以前にそれを使用したことがないので、サンプルコードが回答として提供されればいいでしょう。

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

4

1 に答える 1

0

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

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

(技術的には、この表を使用して最も重要な色を指定することもできますが、それは役に立ちません。最近、実際に使用されているかどうかはわかりません。)

また、GDIはインデックスカラーモードでの作業で信頼性が低いことがわかったので、お勧めしません。

(ここで私の質問を参照してください。ただし、これはGDIに依存することを先延ばしにする必要があります。これは、16-bppまたは32-bppからインデックスカラーに変換することであり、GDIが行う際の問題です。それは正確です:GDIは正確なパレットでインデックスカラーへの変換に失敗しますか? -また、そこにリンクされているコードはいくつかのインデックスカラービットマップを設定するので便利ですが、あなたがしているものには当てはまらないと思いますとにかく16bppデータで支配します。)

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

于 2011-01-10T16:09:40.867 に答える