日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

透明位图的显示(TransparentBlt函数)

發(fā)布時(shí)間:2025/3/12 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 透明位图的显示(TransparentBlt函数) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
包含透明色的位圖的繪制方法有多種,最簡(jiǎn)單的方法是調(diào)用現(xiàn)成的函數(shù):TransparentBlt,也可以通過自己的代碼實(shí)現(xiàn)類似TransparentBlt的功能,實(shí)現(xiàn)過程也有兩種形式,一種是事先做一張掩碼位圖,另一種是動(dòng)態(tài)生成掩碼位圖。本文將介紹動(dòng)態(tài)生成掩碼位圖繪制具有透明區(qū)域位圖的方法。

一、TransparentBlt 函數(shù)的使用?

TransparentBlt 函數(shù)在Windows98/Windows2000以上版本運(yùn)行,系統(tǒng)中需要包含 Msimg32.dll,使用時(shí)可以鏈接 Msimg32.lib。
Windows98下的TransparentBlt會(huì)產(chǎn)生資源泄漏,所以不建議在WIN98下使用該函數(shù)。
TransparentBlt函數(shù)原型如下: BOOL TransparentBlt( HDC hdcDest, // 目標(biāo)DC int nXOriginDest, // 目標(biāo)X偏移 int nYOriginDest, // 目標(biāo)Y偏移 int nWidthDest, // 目標(biāo)寬度 int hHeightDest, // 目標(biāo)高度 HDC hdcSrc, // 源DC int nXOriginSrc, // 源X起點(diǎn) int nYOriginSrc, // 源Y起點(diǎn) int nWidthSrc, // 源寬度 int nHeightSrc, // 源高度 UINT crTransparent // 透明色,COLORREF類型 );

使用示例:

CBitmap FootballBMP; FootballBMP.LoadBitmap(IDB_FOOTBALLBMP); CDC ImageDC; ImageDC.CreateCompatibleDC(pDC); CBitmap *pOldImageBMP = ImageDC.SelectObject(&FootballBMP); TransparentBlt(pDC->m_hDC, 0, 0, 218, 199, ImageDC.m_hDC, 0, 0, 218, 199, RGB(0,0,0xff)); ImageDC.SelectObject(pOldImageBMP);

二、實(shí)現(xiàn)TransparentBlt函數(shù)

為了理解具有透明色位圖的繪制過程,我們來(lái)親手建立一個(gè)具有同TransparentBlt功能一致的實(shí)驗(yàn)函數(shù),稱之為TransparentBlt2。

實(shí)驗(yàn)素材:有兩張位圖:bk.bmp是背景位圖,football.bmp包含透明區(qū)域,透明色為藍(lán)色RGB(0,0,0xff)
實(shí)驗(yàn)?zāi)康?#xff1a;以bk.bmp為背景,將football.bmp繪制到背景中,形成如下的最終效果圖





2.1 透明位圖繪制原理
假設(shè)football.bmp ->載入 HBITMAP hImageBMP -> 選入 HDC hImageDC

2.1.1 生成足球的單色掩碼位圖,透明區(qū)域?yàn)榘咨?#xff08;全1),非透明區(qū)域?yàn)楹谏?#xff08;全0)

HBITMAP hMaskBMP = CreateBitmap(nWidthDest, nHeightDest, 1, 1, NULL); // 建立單色位圖 SetBkColor(hImageDC, RGB(0,0,0xff)); // 設(shè)置背景色為藍(lán)色 BitBlt(hMaskDC, 0, 0, nWidthDest, nHeightDest, hImageDC, 0, 0, SRCCOPY); // 拷貝到hMaskDC

這樣足球位圖中藍(lán)色區(qū)域在掩碼位圖中成了白色,其它區(qū)域?yàn)楹谏?#xff0c;此時(shí)hMaskBMP 如下圖:




(圖一)

2.1.2 設(shè)置背景色為黑色,前景色為白色,將掩碼位圖(圖一)與足球位圖相"與"

SetBkColor(hImageDC, RGB(0,0,0)); SetTextColor(hImageDC, RGB(255,255,255)); BitBlt(hImageDC, 0, 0, nWidthDest, nHeightDest, hMaskDC, 0, 0, SRCAND);

這樣,掩碼位圖中背景色(黑色)的區(qū)域在hImageBMP中被保留,前景色(白色)的部分變?yōu)楹谏?此時(shí)hImageBMP 如下圖:

(圖二)

2.1.3 設(shè)置背景色為白色,前景色為黑色,將掩碼位圖(圖一)與背景進(jìn)行“與”運(yùn)算

SetBkColor(hdcDest,RGB(255,255,255)); SetTextColor(hdcDest,RGB(0,0,0)); BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hMaskDC, 0, 0, SRCAND);

掩碼中白色區(qū)域(數(shù)據(jù)與1相“與”結(jié)果不變)使背景保持不變,黑色區(qū)域變成黑色,此時(shí)背景顯示如下:



(圖三)

2.1.4 將hImageBMP(圖二)與背景(圖三)進(jìn)行“或”運(yùn)算

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

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

2.2 TransparentBlt2函數(shù)全部實(shí)現(xiàn)代碼

void TransparentBlt2( HDC hdcDest, // 目標(biāo)DC
int nXOriginDest, // 目標(biāo)X偏移
int nYOriginDest, // 目標(biāo)Y偏移
int nWidthDest, // 目標(biāo)寬度
int nHeightDest, // 目標(biāo)高度
HDC hdcSrc, // 源DC
int nXOriginSrc, // 源X起點(diǎn)
int nYOriginSrc, // 源Y起點(diǎn)
int nWidthSrc, // 源寬度
int nHeightSrc, // 源高度
UINT crTransparent // 透明色,COLORREF類型
)
{
HBITMAP hOldImageBMP, hImageBMP = CreateCompatibleBitmap(hdcDest, nWidthDest, nHeightDest); // 創(chuàng)建兼容位圖
HBITMAP hOldMaskBMP, hMaskBMP = CreateBitmap(nWidthDest, nHeightDest, 1, 1, NULL); // 創(chuàng)建單色掩碼位圖
HDC hImageDC = CreateCompatibleDC(hdcDest);
HDC hMaskDC = CreateCompatibleDC(hdcDest);
hOldImageBMP = (HBITMAP)SelectObject(hImageDC, hImageBMP);
hOldMaskBMP = (HBITMAP)SelectObject(hMaskDC, hMaskBMP);

// 將源DC中的位圖拷貝到臨時(shí)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);

// 設(shè)置透明色
SetBkColor(hImageDC, crTransparent);

// 生成透明區(qū)域?yàn)榘咨?#xff0c;其它區(qū)域?yàn)楹谏难诖a位圖
BitBlt(hMaskDC, 0, 0, nWidthDest, nHeightDest, hImageDC, 0, 0, SRCCOPY);

// 生成透明區(qū)域?yàn)楹谏?#xff0c;其它區(qū)域保持不變的位圖
SetBkColor(hImageDC, RGB(0,0,0));
SetTextColor(hImageDC, RGB(255,255,255));
BitBlt(hImageDC, 0, 0, nWidthDest, nHeightDest, hMaskDC, 0, 0, SRCAND);

// 透明部分保持屏幕不變,其它部分變成黑色
SetBkColor(hdcDest,RGB(255,255,255));
SetTextColor(hdcDest,RGB(0,0,0));
BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hMaskDC, 0, 0, SRCAND);

// "或"運(yùn)算,生成最終效果
BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hImageDC, 0, 0, SRCPAINT);

// 清理、恢復(fù)
SelectObject(hImageDC, hOldImageBMP);
DeleteDC(hImageDC);
SelectObject(hMaskDC, hOldMaskBMP);
DeleteDC(hMaskDC);
DeleteObject(hImageBMP);
DeleteObject(hMaskBMP);
}

2.3 TransparentBlt的另外一個(gè)版本:TransparentBltU

TransparentBltU是Christian Graus 在WinDEV發(fā)表的一個(gè)函數(shù),功能與TransparentBlt一致,以下是全部實(shí)現(xiàn)代碼:

bool TransparentBltU(
HDC dcDest, // handle to Dest DC
int nXOriginDest, // x-coord of destination upper-left corner
int nYOriginDest, // y-coord of destination upper-left corner
int nWidthDest, // width of destination rectangle
int nHeightDest, // height of destination rectangle
HDC dcSrc, // handle to source DC
int nXOriginSrc, // x-coord of source upper-left corner
int nYOriginSrc, // y-coord of source upper-left corner
int nWidthSrc, // width of source rectangle
int nHeightSrc, // height of source rectangle
UINT crTransparent // color to make transparent
)
{
if (nWidthDest < 1) return false;
if (nWidthSrc < 1) return false;
if (nHeightDest < 1) return false;
if (nHeightSrc < 1) return false;

HDC dc = CreateCompatibleDC(NULL);
HBITMAP bitmap = CreateBitmap(nWidthSrc, nHeightSrc, 1, GetDeviceCaps(dc,
BITSPIXEL), NULL);

if (bitmap == NULL)
{
DeleteDC(dc);
return false;
}

HBITMAP oldBitmap = (HBITMAP)SelectObject(dc, bitmap);

if (!BitBlt(dc, 0, 0, nWidthSrc, nHeightSrc, dcSrc, nXOriginSrc,
nYOriginSrc, SRCCOPY))
{
SelectObject(dc, oldBitmap);
DeleteObject(bitmap);
DeleteDC(dc);
return false;
}

HDC maskDC = CreateCompatibleDC(NULL);
HBITMAP maskBitmap = CreateBitmap(nWidthSrc, nHeightSrc, 1, 1, NULL);

if (maskBitmap == NULL)
{
SelectObject(dc, oldBitmap);
DeleteObject(bitmap);
DeleteDC(dc);
DeleteDC(maskDC);
return false;
}

HBITMAP oldMask = (HBITMAP)SelectObject(maskDC, maskBitmap);

SetBkColor(maskDC, RGB(0,0,0));
SetTextColor(maskDC, RGB(255,255,255));
if (!BitBlt(maskDC, 0,0,nWidthSrc,nHeightSrc,NULL,0,0,BLACKNESS))
{
SelectObject(maskDC, oldMask);
DeleteObject(maskBitmap);
DeleteDC(maskDC);
SelectObject(dc, oldBitmap);
DeleteObject(bitmap);
DeleteDC(dc);
return false;
}

SetBkColor(dc, crTransparent);
BitBlt(maskDC, 0,0,nWidthSrc,nHeightSrc,dc,0,0,SRCINVERT);

SetBkColor(dc, RGB(0,0,0));
SetTextColor(dc, RGB(255,255,255));
BitBlt(dc, 0,0,nWidthSrc,nHeightSrc,maskDC,0,0,SRCAND);

HDC newMaskDC = CreateCompatibleDC(NULL);
HBITMAP newMask;
newMask = CreateBitmap(nWidthDest, nHeightDest, 1,
GetDeviceCaps(newMaskDC, BITSPIXEL), NULL);

if (newMask == NULL)
{
SelectObject(dc, oldBitmap);
DeleteDC(dc);
SelectObject(maskDC, oldMask);
DeleteDC(maskDC);
DeleteDC(newMaskDC);
DeleteObject(bitmap);
DeleteObject(maskBitmap);
return false;
}

SetStretchBltMode(newMaskDC, COLORONCOLOR);
HBITMAP oldNewMask = (HBITMAP) SelectObject(newMaskDC, newMask);
StretchBlt(newMaskDC, 0, 0, nWidthDest, nHeightDest, maskDC, 0, 0,
nWidthSrc, nHeightSrc, SRCCOPY);

SelectObject(maskDC, oldMask);
DeleteDC(maskDC);
DeleteObject(maskBitmap);

HDC newImageDC = CreateCompatibleDC(NULL);
HBITMAP newImage = CreateBitmap(nWidthDest, nHeightDest, 1,
GetDeviceCaps(newMaskDC, BITSPIXEL), NULL);

if (newImage == NULL)
{
SelectObject(dc, oldBitmap);
DeleteDC(dc);
DeleteDC(newMaskDC);
DeleteObject(bitmap);
return false;
}

HBITMAP oldNewImage = (HBITMAP)SelectObject(newImageDC, newImage);
StretchBlt(newImageDC, 0, 0, nWidthDest, nHeightDest, dc, 0, 0, nWidthSrc,
nHeightSrc, SRCCOPY);

SelectObject(dc, oldBitmap);
DeleteDC(dc);
DeleteObject(bitmap);

BitBlt( dcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest,
newMaskDC, 0, 0, SRCAND);

BitBlt( dcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest,
newImageDC, 0, 0, SRCPAINT);

SelectObject(newImageDC, oldNewImage);
DeleteDC(newImageDC);
SelectObject(newMaskDC, oldNewMask);
DeleteDC(newMaskDC);
DeleteObject(newImage);
DeleteObject(newMask);

return true;
}

說(shuō)明:本文提供的TransparentBlt2函數(shù)旨在說(shuō)明透明位圖的顯示原理,在Windows2000以上環(huán)境實(shí)際運(yùn)用中建議使用現(xiàn)成的TransparentBlt函數(shù)來(lái)繪制透明位圖。

源代碼下載!

本文轉(zhuǎn)自:http://www.cnblogs.com/syxchina/archive/2010/06/01/2197688.html

總結(jié)

以上是生活随笔為你收集整理的透明位图的显示(TransparentBlt函数)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲男人天堂2017 | 国产大屁股喷水视频在线观看 | 日本三级吃奶头添泬 | 国产图片区 | 新婚夫妇白天啪啪自拍 | 黄色资源在线播放 | 欧美人妖老妇 | 国产每日更新 | 亚洲色中色 | 清纯唯美第一页 | 一级黄色大片网站 | 国产制服丝袜 | 亚洲国产精品久久久久久 | 91蝌蚪91密月 | 少妇一区二区三区 | av黄色免费在线观看 | 兔费看少妇性l交大片免费 日韩高清不卡 | 深夜福利免费在线观看 | 爱情岛亚洲论坛入口 | 在线观看视频中文字幕 | 日日麻批免费视频播放 | 精品国产乱码一区二区三区99 | 激情成人综合 | 成人免费视频观看视频 | 红桃一区二区三区 | 日日夜夜天天操 | 美女破处视频 | 深夜免费福利 | 麻豆成人网| 黑鬼巨鞭白妞冒白浆 | 水蜜桃av在线 | 国产日韩在线观看一区 | 福利一区福利二区 | 福利91| 熟妇人妻无码xxx视频 | 在线国产日韩 | 冈本视频在线观看 | 91国语对白 | 翔田千里88av中文字幕 | 黄色成人毛片 | 国产精品无圣光 | 巨乳xxx | 亚洲国产成人精品无码区99 | 国产免费片 | 春色网站| www黄色片| 国产人成无码视频在线观看 | 操处女逼视频 | 天天插夜夜操 | 免费福利在线观看 | 狼人精品一区二区三区在线 | 中文在线字幕免费观看电 | 亚洲理论在线观看 | 污导航在线 | 18禁肉肉无遮挡无码网站 | 日韩三区视频 | 欧美成a | 黄色网址在线视频 | 永久免费av无码网站性色av | 精品人妻一区二区三区蜜桃视频 | 老湿影院av | 国产资源网站 | 91精品国产乱码久久 | freesex性hd公交车上 | 色屁屁影院www国产高清麻豆 | 日本在线精品视频 | 亚洲精品国产精品乱码不99热 | 亚洲欧美日本一区 | 国产高清一区在线观看 | 一起草在线视频 | 狠狠躁夜夜躁xxxxaaaa | 国产精品9191 | 亚洲精品福利在线观看 | 欧美成人精品欧美一级 | 涩涩在线看 | 在线91视频 | 免费爱爱网址 | h片在线观看免费 | 久久综合九色综合网站 | 欧美韩日一区二区 | 欧美性黄色 | 欧美成人动态图 | 成品人视频ww入口 | 亚洲第三色 | www.黄色片网站 | a级黄片毛片 | 成人18视频免费69 | 嫩模一区| 国产第一亚洲 | 自拍偷拍999 | 日本三级视频在线播放 | 中文字幕婷婷 | 亚洲啪av永久无码精品放毛片 | 欧美一级专区免费大片 | 韩国精品在线 | 在线观看毛片视频 | 日本一区二区在线观看视频 | 黄色麻豆网站 | 色婷婷导航 |