• ベストアンサー

PlgBltでの透過

PlgBlt描画する画像を透過させたいんですが、やり方がわかりません 多分、引数のHBITMAP hbmMaskに、何かを指定するんだと思うんですが・・・ HBITMAP hbmMask; /*ここの間の処理がわからない・・・*/ PlgBlt( hdc , point , g , 0 ,0 , 150 , 150 , hbmMask , 0 , 0); どのようにかけばいいのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

 こんばんは。面白そうなので私も。  gに選択されているのがHBITMAPなら、HBITMAPを元に作成するのも楽なやり方の一つかもしれません。以下参考程度に。 HBITMAP CreateMaskBitmap(HBITMAP hBmpSrc/*元のグラフィック*/, COLORREF cMaskDesire/*透明にさせたい色を入れる*/) { BITMAP bmp; ::GetObject(hBmpSrc, sizeof(BITMAP), &bmp); HBITMAP hBmpMask = ::CreateBitmap(bmp.bmWidth, bmp.bmHeight, 1, 1, NULL); HDC hDCSrc = ::CreateCompatibleDC(NULL); HDC hDCMask = ::CreateCompatibleDC(NULL); HBITMAP hBmpSrcOld = static_cast<HBITMAP>(::SelectObject(hDCSrc, hBmpSrc)); HBITMAP hBmpMaskOld = static_cast<HBITMAP>(::SelectObject(hDCMask, hBmpMask)); ::PatBlt(hDCMask, 0, 0, bmp.bmWidth, bmp.bmHeight, BLACKNESS); for(int y = 0; y < bmp.bmHeight; ++y) for(int x = 0; x < bmp.bmWidth; ++x) { if(::GetPixel(hDCSrc, x, y) == cMaskDesire) continue; ::SetPixel(hDCMask, x, y, RGB(255, 255, 255)); } ::SelectObject(hDCSrc, hBmpSrcOld); ::SelectObject(hDCMask, hBmpMaskOld); ::DeleteDC(hDCSrc); ::DeleteDC(hDCMask); return hBmpMask; } //hbmOrigの赤色の部分が透過するマスクを作成する HBITMAP hbmMask = CreateMaskBitmap(hbmOrig, RGB(255, 0, 0)); //DCを作成 HDC g = CreateCompatibleDC(...); //ココで選択する SelectObject(g, hbmOrig); //使う PlgBlt( hdc , point , g , 0 ,0 , 150 , 150 , hbmMask , 0 , 0);

sironote
質問者

補足

とてもわかり易そうです ありがとうございます でもうまくいきませんでした・・・ PlgBlt( hdc , point , g , 0 ,0 , 150 , 150 , 0, 0 , 0); これなら描画されるんですが PlgBlt( hdc , point , g , 0 ,0 , 150 , 150 , hbmMask , 0 , 0); マスク指定すると描画されません 今こんな感じのソースになってます ///初期化 HDC hDC=GetDC(hWnd); HDC g; HBITMAP hbmOrig; HBITMAP hbmMask; //ロード hbmOrig = (HBITMAP)LoadImage(NULL,"0.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE); //hbmOrigの赤色の部分が透過するマスクを作成する hbmMask = CreateMaskBitmap(hbmOrig, RGB(255, 0, 0)); //DCを作成 g = CreateCompatibleDC(hDC); //ココで選択する SelectObject(g, hbmOrig); ///ループ { POINT point[3] = { { 0 , 0 } , { 150 , 0 } , { 0 , 150 } }; PlgBlt( hdc , point , g , 0 ,0 , 150 , 150 , hbmMask , 0 , 0); }

その他の回答 (3)

回答No.4

 補足いただきました。  MSペイントブラシで作成したビットマップを、hbmMaskに読み込ませて確認して見たらどうでしょう。  "0.bmp"と同じ寸法を持たせ、透明にしたい所を黒、書きたい所を白で塗ってモノクロでセーブします。 //ロード hbmOrig = (HBITMAP)LoadImage(NULL,"0.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE | LR_DEFAULTSIZE); //MSペイントブラシで作成したモノクロビットマップをファイルからロードする hbmMask = (HBITMAP)LoadImage(hInstance, "testMask.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_DEFAULTSIZE); //DCを作成 g = CreateCompatibleDC(hDC); //ココで選択する SelectObject(g, hbmOrig); ///ループ { POINT point[3] = { { 0 , 0 } , { 150 , 0 } , { 0 , 150 } }; PlgBlt( hdc , point , g , 0 ,0 , 150 , 150 , hbmMask , 0 , 0); }

sironote
質問者

お礼

ほんとにわかりやすいです。 ありがとうございます。 でも、、なんでだろ.... やっぱしマスクを指定すると描画されません もしかしたら、こっちのソースの、別の場所の記述が間違っているのかもしれませんね 少し、今まで回答を参考に一人でさぐってみます。 ありがとうございました。

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.3

PatBlt( hDCMmak, 0, 0, 150, 150, BLACKNESS ); Ellipse( hDCMask, 10, 10, 130, 130 ); 確認用ではなくマスク画像そのもの作成工程です つまり hDCMaskに選択された hbmMaskに 10,10-140,140 の矩形に外接する楕円を描画しています この楕円の内部が透過された画像になります PatBltは念のための処理ですビットマップの背景を塗りつぶしを行っています この場合黒で塗りつぶしています

sironote
質問者

お礼

なるほど! 楕円の部分が透過されていたんですね もっと、色々試すべきでした。すみません。

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

モノクロのビットマックで 大きさはnWidth、nHeightにします # 例示のコードですと 150x150にします このモノクロビットマップの白の部分が元の hdcsrcが描画されます hbmMask = ::CreateBitmap( 150, 150, 1, 1, NULL ); といった具合で作成して hBrMask = ::CreateSolidBrush( RGB( 255, 255, 255 ) ); HBITMAP hOld = (HBITMAP)SelectObject( hDCMask, hBmMask ); HBRUSH hOldBrush = (HBRUSH)SelectObject( hDCmask, hBrush ); PatBlt( hDCMmak, 0, 0, 150, 150, BLACKNESS ); Ellipse( hDCMask, 10, 10, 130, 130 ); SelectObject( hDCMask, hOld ); SelectObject( hDCMask, hOldBrush ); といった具合で マスク画像を作りましょう

sironote
質問者

補足

PatBlt( hDCMmak, 0, 0, 150, 150, BLACKNESS ); Ellipse( hDCMask, 10, 10, 130, 130 ); この二つは、マスクが正常に作られたかどうかの確認用ですよね? PlgBltに必用なのはHBITMAPなので と思って、消してみました。 あと、ブラシもよくわからなかったので消してかいてみたんですが、 PlgBltにマスクを指定すると何も表示されません どこが間違っているのでしょうか? HDC hDCMask; HBITMAP hbmMask = ::CreateBitmap( 150, 150, 1, 1, NULL ); HBITMAP hOld = (HBITMAP)SelectObject( hDCMask, hbmMask ); POINT point[3] = { { 0 , 0 } , { 150 , 0 } , { 0 , 150 } }; PlgBlt( hdc , point , g , 0 ,0 , 150, 150 , hbmMask , 0 , 0);

関連するQ&A