0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

DirectX のテクスチャにGDI のデバイスコンテキストを使用して描画した画像を割り当てる

Last updated at Posted at 2018-04-11

GDI ではアルファを書き込めないので何を書いても透明(アルファ0)にで塗りつぶされるので使い物にならないかも。要調査

GDI+ を使えばアルファも書き込める
アルファを反映するには以下のコードでモードを変更する必要あり。

Graphics myGraphics(hDC);
myGraphics.SetCompositingMode(Gdiplus::CompositingModeSourceCopy);

前提

GDI を使用して描画する仕組みを知っている
http://www.kumei.ne.jp/c_lang/sdk/sdk_24.htm とか

フルカラーのみ。カラーテーブルは考慮していません。

ビットマップ形式のヘッダ、ピクセル情報の格納先はメモリ上に作成、確保しておく必要があります。ヘッダ情報の後ろにピクセル情報をコピーします。
参考 http://www.kumei.ne.jp/c_lang/sdk2/sdk_169.htm

CImage が超便利

考え方

  1. デバイスコンテキストを取得
  2. ビットマップ割り当て
  3. 描画
  4. ビットマップ形式でメモリ上にコピー
  5. メモリ上のデータをテクスチャに割り当て

1 と 2 と 4 について

メモリデバイスコンテキストにビットマップを割り当てる方法

メモリデバイスコンテキストを作成(CreateCompatibleDC)して、ビットマップを割り当てる(CreateCompatibleBitmap)場合

メモリコピーは、GetDIBits でピクセル情報をコピーできるらしい。未確認

GetDIBits は推奨されていないっぽいのでこの方法は使わない方がよさそう

画像を読み込む場合、CImage クラスを使用する方法

CImage クラスで、Load メソッドを使用して読み込んだ場合、ビットマップが割り当て済みのデバイスコンテキストも同時に作成されるので、それを使用して描画すれば読み込んだ画像の上に描画することができる。

メモリコピーは、ピクセル情報は、GetBits メソッドでピクセルの先頭アドレスが取得できるので memcpy で丸ごとコピーできる。
ただし、GetPitch メソッドでマイナスが返ってきた場合、先頭のアドレスでは無く画像の最終行の先頭アドレスを示しているので、本当の先頭アドレスを計算する必要がある。

3 については取得したデバイスコンテキストで描画するだけ

割愛

5 について

コピーしたデータを
D3DXCreateTextureFromFileInMemory または D3DXCreateTextureFromFileInMemoryEx に渡すだけ。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?