2017-05-27 29 views
1

Windows API用の"Transparent Bitmaps"チュートリアルを読んだ後、ビットレベルでSRCANDでBitblt()関数を理解できません。Bitblt()はSRCANDとどのように機能しますか?

SRCANDを使用して1つの白黒ビットマップを描画するためのコードの一部は、このチュートリアルに基づいています。黒い色がままにしながら、ビット単位でAND、ビットマップ画像の白色が結果に消えてどのように私はについて混乱している何

BITMAP bm; 
RECT rcClient; 
PAINTSTRUCT ps; 

HDC hdc = BeginPaint(hwnd, &ps); //hwnd = handle to current window 
HDC hdcMem = CreateCompatibleDC(hdc); 

GetObject(g_hbmBall, sizeof(bm), &bm); //g_hbmBall = handle to bitmap object 

GetClientRect(hwnd, &rcClient); 
FillRect(hdc, &rcClient, (HBRUSH)GetStockObject(LTGRAY_BRUSH)); 

SelectObject(hdcMem, g_hbmBall); 
BitBlt(hdc, 0, 0, bm.bmWidth, bm.bmHeight, hdcMem, 0, 0, SRCAND); 

は、最後の行です。これは私が視覚的に見たものである(SRCANDためのドキュメントは、それが「ブールAND演算子を使用して送信元と送信先の長方形の色を組み合わせます。」と言う)

enter image description here

全体的に、私は思ったんだけど、ビット単位のレベルでは、ウィンドウ内のデバイスコンテキストへのハンドルと、結果として白い色が消える原因となる黒色/黒色のイメージとの比較が行われます。

私が考えたことは、当初、デバイスコンテキストへのハンドルには0しか含まれていなかったということでした。したがって、どの色がANDとなるかに関わらず、0とANDを実行すると常に0が返されるため、最終的にすべてが黒で黒い四角になります。

+0

透明性のために['AlphaBlend'](https://msdn.microsoft.com/en-us/library/windows/desktop/dd183351(v = vs.85).aspx) – RbMm

答えて

2

SRCANDのドキュメントでは、「論理AND演算子を使用して、ソースと の宛先矩形の色を結合します。

さらに正確には、ビット単位で AND演算子が使用されます。

宛先ピクセルは常にグレーです(RGB値は0x7F7F7Fとしましょう)。ソース画像内の白画素の場合、黒画素0x000000の場合、画素値は0xFFFFFFになります。

ソース画素が黒である場合、これは、以下の式になる:

DWORD result = 0x000000 & 0x7F7F7F; 

のみ1ともオペランドであるビットを保持するので、結果は、0x000000(黒)です。

ソースピクセルが白である場合我々は、以下の式を有する:

DWORD result = 0xFFFFFF & 0x7F7F7F; 

結果は0x7F7F7F(灰色)は、これらが1の両方のオペランドであるビットがあるためです。

+0

おかげで、本当に素晴らしい答えでした。 – DragonautX

関連する問題