图片镂空算法集合[图]

在开发界面及棋牌游戏过程中,需要很多镂空的图片,而且图片形式一般比较固定.

所以封装了几种常见的镂空方法.

1. 用于没有掩码图,只有指定透明色,不进行伸缩

void DrawTransBitmap(HDChdcDest, // 目标DC
int nXOriginDest, // 目标X偏移
int nYOriginDest, // 目标Y偏移
int nWidthDest, // 目标宽度
int nHeightDest, // 目标高度
HDChdcSrc, // 源DC
int nXOriginSrc, // 源X起点
int nYOriginSrc, // 源Y起点
COLORREF crTransparent // 透明色,COLORREF类型
);

适用图片:

2. 用于没有掩码图,只有指定透明色,可以进行伸缩

void DrawTransBitmap(HDChdcDest, // 目标DC
int nXOriginDest, // 目标X偏移
int nYOriginDest, // 目标Y偏移
int nWidthDest, // 目标宽度
int nHeightDest, // 目标高度
HDChdcSrc, // 源DC
int nXOriginSrc, // 源X起点
int nYOriginSrc, // 源Y起点
int nWidthSrc, // 源宽度
int nHeightSrc, // 源高度
COLORREF crTransparent // 透明色,COLORREF类型
);

适用图片:同1,可拉伸

3.指定掩码图,和掩码图属于不同图片

void DrawTransBitmap(HDChdcDest, // 目标DC
int nXOriginDest, // 目标X偏移
int nYOriginDest, // 目标Y偏移
int nWidthDest, // 目标宽度
int nHeightDest, // 目标高度
HDChdcSrc, // 源DC
HDChdcMask, // 掩码DC
int nXOriginSrc, // 源X起点
int nYOriginSrc, // 源Y起点
COLORREFcrTransparent // 透明色,COLORREF类型
);

适用图片:

4.指定图片和掩码图同属于一张图片

void DrawTransBitmap(HDChDC,
int nPosX,
int nPosY,
int nCX,
int nCY,
HBITMAPhObj
);

适用图片:

5.得到位图HRGN

HRGNCreateBitmapRgn( int nWidth, int nHeight,HBITMAPhbmp,COLORREFcTrans);

适用图片:图片镂空算法集合[图]

以下是完整代码

// 用于没有掩码图,只有指定透明色,不进行伸缩
void CCommon::DrawTransBitmap(HDChdcDest, // 目标DC
int nXOriginDest, // 目标X偏移
int nYOriginDest, // 目标Y偏移
int nWidthDest, // 目标宽度
int nHeightDest, // 目标高度
HDChdcSrc, // 源DC
int nXOriginSrc, // 源X起点
int nYOriginSrc, // 源Y起点
COLORREFcrTransparent // 透明色,COLORREF类型
)
...
... {
HBITMAPhOldImageBMP,hImageBMP
=CreateCompatibleBitmap(hdcDest,nWidthDest,nHeightDest);//创建兼容位图
HBITMAPhOldMaskBMP,hMaskBMP=CreateBitmap(nWidthDest,nHeightDest,1,1,NULL);//创建单色掩码位图
HDChImageDC=CreateCompatibleDC(hdcDest);//临时DC
HDChMaskDC=CreateCompatibleDC(hdcDest);//临时掩码DC
hOldImageBMP=(HBITMAP)SelectObject(hImageDC,hImageBMP);
hOldMaskBMP
=(HBITMAP)SelectObject(hMaskDC,hMaskBMP);

//将源DC中的位图拷贝到临时DC中,源DC已经载入位图
BitBlt(hImageDC,0,0,nWidthDest,nHeightDest,hdcSrc,nXOriginSrc,nYOriginSrc,SRCCOPY);

//设置临时DC的透明色
SetBkColor(hImageDC,crTransparent);

//生成透明区域为白色,其它区域为黑色的临时掩码DC的掩码位图
//位图来自临时DC
BitBlt(hMaskDC,0,0,nWidthDest,nHeightDest,hImageDC,0,0,SRCCOPY);

//生成透明区域为黑色,其它区域保持不变的位图
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);

//"或"运算,生成最终效果
BitBlt(hdcDest,nXOriginDest,nYOriginDest,nWidthDest,nHeightDest,hImageDC,0,0,SRCPAINT);

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



// 用于没有掩码图,只有指定透明色,可以进行伸缩
void CCommon::DrawTransBitmap(HDChdcDest, // 目标DC
int nXOriginDest, // 目标X偏移
int nYOriginDest, // 目标Y偏移
int nWidthDest, // 目标宽度
int nHeightDest, // 目标高度
HDChdcSrc, // 源DC
int nXOriginSrc, // 源X起点
int nYOriginSrc, // 源Y起点
int nWidthSrc, // 源宽度
int nHeightSrc, // 源高度
COLORREFcrTransparent // 透明色,COLORREF类型
)
...
... {
HBITMAPhOldImageBMP,hImageBMP
=CreateCompatibleBitmap(hdcDest,nWidthDest,nHeightDest);//创建兼容位图
HBITMAPhOldMaskBMP,hMaskBMP=CreateBitmap(nWidthDest,nHeightDest,1,1,NULL);//创建单色掩码位图
HDChImageDC=CreateCompatibleDC(hdcDest);
HDChMaskDC
=CreateCompatibleDC(hdcDest);
hOldImageBMP
=(HBITMAP)SelectObject(hImageDC,hImageBMP);
hOldMaskBMP
=(HBITMAP)SelectObject(hMaskDC,hMaskBMP);

//将源DC中的位图拷贝到临时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);

//生成透明区域为白色,其它区域为黑色的掩码位图
BitBlt(hMaskDC,0,0,nWidthDest,nHeightDest,hImageDC,0,0,SRCCOPY);

//生成透明区域为黑色,其它区域保持不变的位图
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(0xff,0xff,0xff));
SetTextColor(hdcDest,RGB(
0,0,0));
BitBlt(hdcDest,nXOriginDest,nYOriginDest,nWidthDest,nHeightDest,hMaskDC,
0,0,SRCAND);

//"或"运算,生成最终效果
BitBlt(hdcDest,nXOriginDest,nYOriginDest,nWidthDest,nHeightDest,hImageDC,0,0,SRCPAINT);

SelectObject(hImageDC,hOldImageBMP);
DeleteDC(hImageDC);
SelectObject(hMaskDC,hOldMaskBMP);
DeleteDC(hMaskDC);
DeleteObject(hImageBMP);
DeleteObject(hMaskBMP);

}



指定掩码图,和掩码图属于不同图片
void CCommon::DrawTransBitmap(HDChdcDest, // 目标DC
int nXOriginDest, // 目标X偏移
int nYOriginDest, // 目标Y偏移
int nWidthDest, // 目标宽度
int nHeightDest, // 目标高度
HDChdcSrc, // 源DC
HDChdcMask,
int nXOriginSrc, // 源X起点
int nYOriginSrc, // 源Y起点
COLORREFcrTransparent // 透明色,COLORREF类型
)
...
... {

HBITMAPhOldImageBMP,hImageBMP
=CreateCompatibleBitmap(hdcDest,nWidthDest,nHeightDest);//创建兼容位图
HDChImageDC=CreateCompatibleDC(hdcDest);//临时DC
hOldImageBMP=(HBITMAP)SelectObject(hImageDC,hImageBMP);

//将源DC中的位图拷贝到临时DC中,源DC已经载入位图
BitBlt(hImageDC,0,0,nWidthDest,nHeightDest,hdcSrc,nXOriginSrc,nYOriginSrc,SRCCOPY);
//设置临时DC的透明色
SetBkColor(hImageDC,crTransparent);
//生成透明区域为黑色,其它区域保持不变的位图
SetBkColor(hImageDC,RGB(0,0,0));
SetTextColor(hImageDC,RGB(
255,255,255));
BitBlt(hImageDC,
0,0,nWidthDest,nHeightDest,hdcMask,0,0,SRCAND);
//透明部分保持屏幕不变,其它部分变成黑色
SetBkColor(hdcDest,RGB(255,255,255));
SetTextColor(hdcDest,RGB(
0,0,0));
BitBlt(hdcDest,nXOriginDest,nYOriginDest,nWidthDest,nHeightDest,hdcMask,
0,0,SRCAND);
//"或"运算,生成最终效果
BitBlt(hdcDest,nXOriginDest,nYOriginDest,nWidthDest,nHeightDest,hImageDC,0,0,SRCPAINT);
//清理、恢复
SelectObject(hImageDC,hOldImageBMP);
DeleteDC(hImageDC);
DeleteObject(hImageBMP);
}


指定图片和掩码图同属于一张图片
void CCommon::DrawTransBitmap(HDChDC, int nPosX, int nPosY, int nCX, int nCY,HBITMAPhObj)
...
... {
HDChMemDC
=CreateCompatibleDC(hDC);
HBITMAPhOldBMP
=(HBITMAP)::SelectObject(hMemDC,hObj);
BitBlt(hDC,nPosX,nPosY,nCX,nCY,hMemDC,nCX,
0,SRCAND);
BitBlt(hDC,nPosX,nPosY,nCX,nCY,hMemDC,
0,0,SRCPAINT);
SelectObject(hMemDC,hOldBMP);
DeleteDC(hMemDC);

}


HRGNCCommon::CreateBitmapRgn(
int nWidth, int nHeight,HBITMAPhbmp,COLORREFTransColor)
...
... {

HDChmemDC;
//创建与传入DC兼容的临时DC
hmemDC=::CreateCompatibleDC(NULL);

HBITMAPhOldBmp
=(HBITMAP)::SelectObject(hmemDC,hbmp);


//创建总的窗体区域,初始region为0
HRGNhrgn;
hrgn
=::CreateRectRgn(0,0,0,0);


inty;
for(y=0;y<nHeight;y++)
...
...{
HRGNrgnTemp;
//保存临时region

intiX=0;
do
alt=
分享到:
评论

你可能感兴趣的:(游戏,算法)