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);
この回答への補足
とてもわかり易そうです
ありがとうございます
でもうまくいきませんでした・・・
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);
}
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);
}
ほんとにわかりやすいです。
ありがとうございます。
でも、、なんでだろ....
やっぱしマスクを指定すると描画されません
もしかしたら、こっちのソースの、別の場所の記述が間違っているのかもしれませんね
少し、今まで回答を参考に一人でさぐってみます。
ありがとうございました。
No.3
- 回答日時:
PatBlt( hDCMmak, 0, 0, 150, 150, BLACKNESS );
Ellipse( hDCMask, 10, 10, 130, 130 );
確認用ではなくマスク画像そのもの作成工程です
つまり hDCMaskに選択された hbmMaskに
10,10-140,140 の矩形に外接する楕円を描画しています
この楕円の内部が透過された画像になります
PatBltは念のための処理ですビットマップの背景を塗りつぶしを行っています
この場合黒で塗りつぶしています
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 );
といった具合で マスク画像を作りましょう
この回答への補足
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が見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 画像編集・動画編集・音楽編集 画質を落とさず切り取って透過したいです 2 2022/06/08 12:28
- Photoshop(フォトショップ) 塗りつぶした画像を透過させない方法について。上からレイヤーで塗った場合は透過できると聞きましたが、レ 1 2022/10/22 13:41
- Illustrator(イラストレーター) Illustratorで白い部分のみを透過させたいです。 2 2022/10/10 22:27
- その他(芸術・クラフト) pixivファクトリーでアクキーを作りたいと思ってますが、やり方がわかりません。 イラストを透過する 2 2022/04/01 22:05
- Photoshop(フォトショップ) 【至急】 ウェブサイトやアプリとかでよく見かける、添付画像のように背景にあるものをぼかしつつ透過する 2 2023/07/17 10:57
- 防犯・セキュリティ メンズエステについて(通報) 2 2023/02/09 17:35
- デザイン メディバンペイント。色塗りの失敗について。 1 2022/11/07 12:12
- その他(クラウドサービス・オンラインストレージ) Canva(キャンバ サムネイル作るサイト)での加工について(人物だけ、光沢感あるグラデーション) 1 2023/04/01 22:09
- Photoshop(フォトショップ) photoshopについて このサイトにあるような方法を背景透過している画像にやると、雷を纏ったよう 1 2022/06/17 18:51
- 化学 シリコンの透過率についてです。 シリコンの波長633nmの可視光の透過率について複素屈折率から計算し 2 2023/02/07 11:32
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
SetWindowRgn()関数について。
-
GetDC()とCreateCompatibleDC()
-
メモリデバイスコンテキストを...
-
BeginPaintの使い方
-
コンテキスト依存とは?
-
VC++のTextOutの再描画の仕方
-
エクセルで作った新しいウイン...
-
グラフの交点の求め方(Excel)
-
「アイテムは収集されました」...
-
フォントの大きさ
-
c言語でキーボードから2点の座...
-
コントロールの書式設定で、“コ...
-
ドロップダウンリストのフォン...
-
コンボボックス内の文字サイズ変更
-
UWSCで特定のChromeのタブをア...
-
PCで「使用可能な場合はグラフ...
-
Excel VBAでのMultipageの選択
-
MFCのタイマーのつかい方を教え...
-
エクセルである点からの距離で...
-
Excelの上下を固定したい
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
コンテキスト依存とは?
-
Win32APIにて、アイコンの情報...
-
PlgBltでの透過
-
画面がチカチカする
-
GetDC()とCreateCompatibleDC()
-
VBでFD、USBの有効・無効...
-
VC++でBitmapとText文字を表示...
-
コントロール内の文字の背景色
-
画像処理 ビットマップ ダブ...
-
BitBlt関数について教えてください
-
メモリデバイスコンテキスト&...
-
Rectangleで、リソースが解放さ...
-
画面のちらつきについて
-
Windowsプログラミング 画面描...
-
ビットマップ(表示速度とサイズ)
-
メモリデバイスコンテキストを...
-
ダブルバッファの作り方
-
TextOutについて
-
SetWindowRgn()関数について。
-
領域を塗りつぶしたい
おすすめ情報