1. 程式人生 > >用BitBlt實現透明貼圖

用BitBlt實現透明貼圖

把透明貼圖的原理記下來! 實驗素材:有兩張點陣圖:bk.bmp是背景點陣圖,football.bmp包含透明區域,透明色為藍色RGB(0,0,0xff)
實驗目的:以bk.bmp為背景,將football.bmp繪製到背景中,形成如下的最終效果圖。



1.透明點陣圖繪製原理
假設football.bmp ->載入 HBITMAP hImageBMP -> 選入 HDC hImageDC

2.生成足球的單色掩碼點陣圖,透明區域為白色(全1),非透明區域為黑色(全0) 

HBITMAP hMaskBMP = CreateBitmap(nWidthDest, nHeightDest, 1, 1, NULL); // 建立單色點陣圖

SetBkColor(hImageDC, RGB(0,0,0xff)); // 設定背景色為藍色

BitBlt(hMaskDC, 0, 0, nWidthDest, nHeightDest, hImageDC, 0, 0, SRCCOPY); // 拷貝到hMaskDC

這樣足球點陣圖中藍色區域在掩碼點陣圖中成了白色,其它區域為黑色,此時hMaskBMP 如下圖:



3.設定背景色為黑色,前景色為白色,將掩碼點陣圖(圖一)與足球點陣圖相"與" 

SetBkColor(hImageDC, RGB(0,0,0));

SetTextColor(hImageDC, RGB(255,255,255));

BitBlt(hImageDC, 0, 0, nWidthDest, nHeightDest, hMaskDC, 0, 0, SRCAND);

這樣,掩碼點陣圖中背景色(黑色)的區域在hImageBMP中被保留,前景色(白色)的部分變為黑色。 此時hImageBMP 如下圖:


4.設定背景色為白色,前景色為黑色,將掩碼點陣圖(圖一)與背景進行“與”運算

SetBkColor(hdcDest,RGB(255,255,255));

SetTextColor(hdcDest,RGB(0,0,0));

BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hMaskDC, 0, 0, SRCAND);

掩碼中白色區域(資料與1相“與”結果不變)使背景保持不變,黑色區域變成黑色,此時背景顯示如下:



5.將hImageBMP(圖二)與背景(圖三)進行“或”運算 

BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hImageDC, 0, 0, SRCPAINT);

這樣就將足球繪製到背景上了。