7

紹介と関連情報:

最近、ここSOで、ビットマップを適切にスケーリングして画像の品質を維持できるようにすることについて質問しました。

ボタンの背景で拡大/縮小すると、ビットマップの品質が低下します

コメントでの提案を採用して、`StretchBlt を使用しようとしたので、小さなデモ プログラムを作成しました。

ストレッチ モードを に設定した後、ビットマップのシャープネスが改善されましたBLACKONWHITE

ビットマップの一部を、たとえば黒などの特定の色で透明にしたいと思います。

以前に TransparentBlt を使用したことがありますが、現在はその方法がわかりません。

問題:

画像のシャープネスを維持するためStretchBltに、メモリ DC でストレッチ モードを使用する必要がありますBLACKONWHITE

Blt問題は、メイン ウィンドウの DC に透過的にアクセスする方法がわからないことです。

デモ アプリのコード スニペットを次に示します。

    case WM_PAINT:
         {
              // main window's DC

              hdc = BeginPaint(hWnd, &ps);

              // main window's client rectangle

              RECT r;

              GetClientRect( hWnd, &r );

              // memory DC for double buffering

              HDC MemDC = CreateCompatibleDC( hdc );

              // fill it with test brush

              FillRect( MemDC, &r, (HBRUSH)GetStockObject( GRAY_BRUSH ) );

              // select loaded bitmap into memory DC

              HBITMAP old = (HBITMAP)SelectObject( MemDC, bmp );

              // get bitmaps dimensions

              BITMAP b;

              GetObject( bmp, sizeof(BITMAP), &b );

              //  needed to preserve bitmap's sharpness

              SetStretchBltMode( hdc, BLACKONWHITE );

              StretchBlt( hdc, 0, 0, r.right - r.left, r.bottom - r.top, 
                             MemDC, 0, 0, b.bmWidth, b.bmHeight, SRCCOPY );

              /* TransparentBlt( ... ); call should go here, 

                 so I can make portion of the bitmap transparent,

                 in order for the gray brush can be seen */

              // cleanup

              SelectObject( MemDC, old );

              DeleteDC(MemDC);

              EndPaint(hWnd, &ps);

         }
         return 0L;
         break;

質問:

上記のコードを変更して、テスト ブラシが表示されるようにビットマップを透明にするにはどうすればよいですか?

元画像は以下。

ここに画像の説明を入力

TransparentBlt( ..., RGB( 0, 0, 0 ) );黒い領域で透明にするために使用する必要があります。

結果を示す画像の例:

ここに画像の説明を入力

私の取り組み:

インターネットをブラウジングすると、ダブルバッファリングに関する簡単なチュートリアルしか見つかりませんでした。

このようなものは見つかりませんでしたが、正直なところ、WIN32 API の経験が浅いため、より良い検索結果を得るために、質問を適切に表現する方法がわかりません。

さらに詳しい情報が必要な場合は、お尋ねください。提供いたします。

質問を短くするために省略されています。

4

1 に答える 1