VC透明ビットマップの実現原理
原文出典:http://blog.csdn.net/ThomasLiu83/archive/2005/08/01/443385.aspx
透明度と不透明度:
透明画素は、ターゲットファイルに影響を与えない画素であり、見えない画素である.不透明なピクセルとは、ターゲットファイル上で元の位置を上書きする点に現れるピクセルです.
白と黒:それぞれ全1と全0の値と仮定
基本的な操作:BitBltはソースファイルからターゲットファイルへのブロック転送に関連し、また単色とカラービットマップ間の変換もある.
単色とカラービットマップの間の変換:単色ビットマップからカラービットマップに、単色ビットマップの中で1の場所はまずカラービットマップの背景色に変換する必要があり、全0の場所は前景色に変換し、それからブロック間操作を行う必要がある.カラービットマップからモノクロビットマップまで、カラービットマップの背景色と一致するすべての箇所を全1、すなわち白、残りの部分を0、黒に設定し、操作します.
(原文:When using BitBlt()to convert a monochrome bitmap to a color bitmap,GDI transforms all white bits(1)to the background color of the destination device context(DC).GDI transforms all black bits(0)to the text(or foreground)color of the destination DC.Whusen ing BitBlt() to convert a color bitmap to a monochrome bitmap, GDI sets to white (1) all pixels that match the background color of the source DC. All other bits are set to black (0).)
ラスタ操作:
BitBlt関数の最後のパラメータは、ソースファイル、ターゲットファイル、モード(現在選択されているブラシブラシブラシで定義されている)のビットを組み合わせてターゲットファイルを形成する方法を明確に定義するラスタアクション(ROP)を指定します.1ビットマップは1ビット値の集合にすぎないため,格子動作(ROP)は1ビット上で動作するブール式にすぎない.使用するデバイスに応じて、ビットマップの中のは異なるものを表します.
多色デバイスでは、各画素は、色を指すインデックスを形成するか、直接色を表すビットセットによって表される. モノクロデバイスでは、各画素は1ビットで表され、0は黒、1は白で表される.全てのデバイスタイプについて,格子動作(ROP)は,それらの実際の意味を考慮せずに,簡単にインプレイスディスプレイ上でのみ行われる.
SRCCOPY
src
ソースを目的地に直接コピー
SRCAND
src and dest
ターゲットファイルの中でソースファイルの黒い領域に対応する部分を黒くし、白い領域に対応する部分をそのまま残しておく
SRCINVERT
src XOR dest
ソースをターゲットに挿入します.2回使用すると、ターゲットは元の状態に戻ります.ある条件下でSRCPAINTの代わりに動作することができる
SRCPAINT
src OR dest
ソースファイルの白以外の領域をターゲットファイルにブラシします.ソースの黒い領域はターゲットに変換されません.
主に説明するラスタ操作: SRCINVERTは、2回の排他的または非排他的な動作を実現し、例えば1と1の排他的または0、0と1の排他的または結果は1であり、前の値に戻る.
使用例:
- /* */
-
- BOOL DrawTransparentBmp(HDC hdcDest,
- int nXOriginDest,
- int nYOriginDest,
- int nWidthDest,
- int nHeightDest,
- HDC hdcSrc,
- int nXOriginSrc,
- int nYOriginSrc,
- int nWidthSrc,
- int nHeightSrc,
- UINT crTransparent)
- {
- if (nWidthDest < 1)
- {
- return false;
- }
-
- if (nWidthSrc < 1)
- {
- return false;
- }
-
- if (nHeightDest < 1)
- {
- return false;
- }
-
- if (nHeightSrc < 1)
- {
- return false;
- }
-
- HDC hMaskDC,hImageDC;
- HBITMAP hMaskBitmap,hOldMaskBitmap;
- HBITMAP hImageBitmap,hOldImageBitmap;
-
- // mask DC DC
- hMaskDC = CreateCompatibleDC(hdcDest);
- hImageDC = CreateCompatibleDC(hdcDest);
-
- // mask image
- hMaskBitmap = CreateBitmap(nWidthSrc,nHeightSrc,1,1,NULL); //
- hImageBitmap = CreateCompatibleBitmap(hdcDest,nWidthSrc,nHeightSrc); //
-
- // DC
- hOldImageBitmap = (HBITMAP)SelectObject(hImageDC,hImageBitmap);
- hOldMaskBitmap = (HBITMAP)SelectObject(hMaskDC,hMaskBitmap);
-
- // src image DC
- if (nWidthDest == nWidthSrc && nHeightDest == nHeightSrc)
- {
- BitBlt(hImageDC, 0, 0, nWidthDest, nHeightDest,
- hdcSrc, nXOriginSrc, nYOriginSrc, SRCCOPY);
- }
- else
- {
- StretchBlt(hImageDC, 0, 0, nWidthDest, nHeightDest, hdcSrc,
- nXOriginSrc, nYOriginSrc, nWidthSrc, nHeightSrc, SRCCOPY);
- }
-
- //
- SetBkColor(hImageDC,crTransparent);
- // (mask bitmap), 1, 0
- // mask ,
- BitBlt(hMaskDC, 0, 0, nWidthSrc, nHeightSrc,
- hImageDC, nXOriginSrc, nYOriginSrc, SRCCOPY);
- SetBkColor(hdcDest, RGB(255, 255, 255));
- SetTextColor(hdcDest, RGB(0, 0, 0));
-
- BitBlt(hdcDest, nXOriginDest, nYOriginDest,
- nWidthSrc, nHeightDest, hImageDC, nXOriginSrc, nYOriginSrc, SRCINVERT);
- BitBlt(hdcDest, nXOriginDest, nYOriginDest,
- nWidthSrc, nHeightDest, hMaskDC, 0, 0, SRCAND);
- BitBlt(hdcDest, nXOriginDest, nYOriginDest,
- nWidthSrc, nHeightDest, hImageDC, nXOriginSrc, nYOriginSrc, SRCINVERT);
- return true;
- }
解説:
//Set up destination for monochrome blt (only needed for monochrome //mask). These are the default values and may not need to be //changed. They should also be restored. SetBkColor(hdcDest, RGB(255, 255, 255));//1s --> 0xFFFFFF SetTextColor(hdcDest, RGB(0, 0, 0));//0s --> 0x000000
//Do the real work. BitBlt(hdcDest, x, y, dx, dy, hdcSrc, x0, y0, SRCINVERT); BitBlt(hdcDest, x, y, dx, dy, hdcMask, 0, 0, SRCAND); BitBlt(hdcDest, x, y, dx, dy, hdcSrc, x0, y0, SRCINVERT); マスクされたブロック転送処理の3つのステップは、第1のステップ(SRCINVERT付きビットブロック転送)がソースビットマップをターゲットファイルに異ならせるか、またはターゲットファイルに異ならせるかのいずれかである.これは少し面白いように見えますが、2番目のステップは、ターゲットファイルを元の状態に復元する効果があります.第2ステップ(SRCAND付きビットブロック転送)は、シールド動作である.マスクがターゲットファイルと一致すると、すべての透明ピクセルはターゲットファイルのピクセルを変更しませんが、不透明ピクセルは直接ターゲットファイルを黒くします.ターゲットファイルには、ソースファイルの不透明な部分が描画されたイメージに与えられ、それ自体が透明な部分にある異またはイメージに与えられます.ステップ3(SRCINVERT付きビットブロック転送)は、ソースファイルと異なるか、ターゲットファイルに送信されます.透明画素はソース状態に復元され(2ステップで実行可能)、不透明画素は季節的にソースファイルからコピーされます.