Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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 に渡すだけ。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした