アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

どのようにかけばいいのでしょうか?

A 回答 (4件)

 こんばんは。

面白そうなので私も。
 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);

この回答への補足

とてもわかり易そうです
ありがとうございます

でもうまくいきませんでした・・・


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);
}

補足日時:2008/10/23 03:43
    • good
    • 0

 補足いただきました。


 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);
}
    • good
    • 0
この回答へのお礼

ほんとにわかりやすいです。
ありがとうございます。

でも、、なんでだろ....
やっぱしマスクを指定すると描画されません

もしかしたら、こっちのソースの、別の場所の記述が間違っているのかもしれませんね

少し、今まで回答を参考に一人でさぐってみます。
ありがとうございました。

お礼日時:2008/10/23 10:28

PatBlt( hDCMmak, 0, 0, 150, 150, BLACKNESS );


Ellipse( hDCMask, 10, 10, 130, 130 );
確認用ではなくマスク画像そのもの作成工程です

つまり hDCMaskに選択された hbmMaskに
10,10-140,140 の矩形に外接する楕円を描画しています
この楕円の内部が透過された画像になります

PatBltは念のための処理ですビットマップの背景を塗りつぶしを行っています
この場合黒で塗りつぶしています
    • good
    • 0
この回答へのお礼

なるほど!
楕円の部分が透過されていたんですね

もっと、色々試すべきでした。すみません。

お礼日時:2008/10/23 10:16

モノクロのビットマックで 大きさは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 );
といった具合で マスク画像を作りましょう

この回答への補足

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);

補足日時:2008/10/23 02:57
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!