·天新网首页·加入收藏·设为首页·网站导航
数码笔记本手机摄像机相机MP3MP4GPS
硬件台式机网络服务器主板CPU硬盘显卡
办公投影打印传真
家电电视影院空调
游戏网游单机动漫
汽车新车购车试驾
下载驱动源码
学院开发设计
考试公务员高考考研
业界互联网通信探索
您现在的位置:天新网 > 软件开发 > 开发文摘 > 其他文摘
图片镂空算法集合[图]
http://www.21tx.com 2006年11月14日 打雷啦

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

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

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

图片镂空算法集合[图]void DrawTransBitmap( HDC hdcDest,            // 目标DC
图片镂空算法集合[图]
                                            int nXOriginDest,       // 目标X偏移
图片镂空算法集合[图]
                                            int nYOriginDest,       // 目标Y偏移
图片镂空算法集合[图]
                                            int nWidthDest,          // 目标宽度
图片镂空算法集合[图]
                                            int nHeightDest,        // 目标高度
图片镂空算法集合[图]
                                            HDC hdcSrc,              // 源DC
图片镂空算法集合[图]
                                            int nXOriginSrc,         // 源X起点
图片镂空算法集合[图]
                                            int nYOriginSrc,         // 源Y起点
图片镂空算法集合[图]
                                            COLORREF crTransparent // 透明色,COLORREF类型
图片镂空算法集合[图]
                                        );
图片镂空算法集合[图]
图片镂空算法集合[图]

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

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

图片镂空算法集合[图] void DrawTransBitmap( HDC hdcDest,       // 目标DC
图片镂空算法集合[图]
                                             int nXOriginDest,   // 目标X偏移
图片镂空算法集合[图]
                                             int nYOriginDest,   // 目标Y偏移
图片镂空算法集合[图]
                                             int nWidthDest,      // 目标宽度
图片镂空算法集合[图]
                                             int nHeightDest,    // 目标高度
图片镂空算法集合[图]
                                             HDC hdcSrc,          // 源DC
图片镂空算法集合[图]
                                             int nXOriginSrc,     // 源X起点
图片镂空算法集合[图]
                                             int nYOriginSrc,     // 源Y起点
图片镂空算法集合[图]
                                             int nWidthSrc,        // 源宽度
图片镂空算法集合[图]
                                             int nHeightSrc,      // 源高度
图片镂空算法集合[图]
                                             COLORREF crTransparent  // 透明色,COLORREF类型
图片镂空算法集合[图]
      );

适用图片:同1,可拉伸

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

图片镂空算法集合[图] void DrawTransBitmap( HDC hdcDest,        // 目标DC
图片镂空算法集合[图]
                                             int nXOriginDest,    // 目标X偏移
图片镂空算法集合[图]
                                             int nYOriginDest,    // 目标Y偏移
图片镂空算法集合[图]
                                             int nWidthDest,       // 目标宽度
图片镂空算法集合[图]
                                             int nHeightDest,     // 目标高度
图片镂空算法集合[图]
                                             HDC hdcSrc,          // 源DC
图片镂空算法集合[图]
                                             HDC hdcMask,       //掩码DC
图片镂空算法集合[图]
                                             int nXOriginSrc,     // 源X起点
图片镂空算法集合[图]
                                             int nYOriginSrc,     // 源Y起点
图片镂空算法集合[图]
                                            COLORREF crTransparent  // 透明色,COLORREF类型
图片镂空算法集合[图]
                                          );

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

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

图片镂空算法集合[图]void DrawTransBitmap(HDC hDC, 
图片镂空算法集合[图]                                          
int nPosX, 
图片镂空算法集合[图]                                           
int nPosY,
图片镂空算法集合[图]                                           
int nCX, 
图片镂空算法集合[图]                                           
int nCY, 
图片镂空算法集合[图]                                           HBITMAP hObj
                                           );

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

5.得到位图HRGN

   HRGN CreateBitmapRgn(int nWidth,int nHeight,HBITMAP hbmp,COLORREF cTrans);

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

以下是完整代码

 

图片镂空算法集合[图]//用于没有掩码图,只有指定透明色,不进行伸缩
图片镂空算法集合[图]
void CCommon::DrawTransBitmap( HDC hdcDest,      // 目标DC
图片镂空算法集合[图]
                    int nXOriginDest,   // 目标X偏移
图片镂空算法集合[图]
                    int nYOriginDest,   // 目标Y偏移
图片镂空算法集合[图]
                    int nWidthDest,     // 目标宽度
图片镂空算法集合[图]
                    int nHeightDest,    // 目标高度
图片镂空算法集合[图]
                    HDC hdcSrc,         // 源DC
图片镂空算法集合[图]
                    int nXOriginSrc,    // 源X起点
图片镂空算法集合[图]
                    int nYOriginSrc,    // 源Y起点
图片镂空算法集合[图]
                    COLORREF crTransparent  // 透明色,COLORREF类型
图片镂空算法集合[图]
                    )
图片镂空算法集合[图]...
{
图片镂空算法集合[图]    HBITMAP hOldImageBMP, hImageBMP 
= CreateCompatibleBitmap(hdcDest, nWidthDest, nHeightDest);    // 创建兼容位图
图片镂空算法集合[图]
    HBITMAP hOldMaskBMP, hMaskBMP = CreateBitmap(nWidthDest, nHeightDest, 11, NULL);            // 创建单色掩码位图
图片镂空算法集合[图]
    HDC        hImageDC = CreateCompatibleDC(hdcDest);//临时DC 
图片镂空算法集合[图]
    HDC        hMaskDC = CreateCompatibleDC(hdcDest);//临时掩码DC 
图片镂空算法集合[图]
    hOldImageBMP = (HBITMAP)SelectObject(hImageDC, hImageBMP);
图片镂空算法集合[图]    hOldMaskBMP 
= (HBITMAP)SelectObject(hMaskDC, hMaskBMP);
图片镂空算法集合[图]
图片镂空算法集合[图]    
// 将源DC中的位图拷贝到临时DC中,源DC已经载入位图
图片镂空算法集合[图]
     BitBlt(hImageDC, 00, nWidthDest, nHeightDest, hdcSrc, nXOriginSrc, nYOriginSrc, SRCCOPY);
图片镂空算法集合[图] 
图片镂空算法集合[图]    
// 设置临时DC的透明色
图片镂空算法集合[图]
    SetBkColor(hImageDC, crTransparent);
图片镂空算法集合[图]
图片镂空算法集合[图]    
// 生成透明区域为白色,其它区域为黑色的临时掩码DC的掩码位图
图片镂空算法集合[图]    
// 位图来自临时DC
图片镂空算法集合[图]
    BitBlt(hMaskDC, 00, nWidthDest, nHeightDest, hImageDC, 00, SRCCOPY);
图片镂空算法集合[图]
图片镂空算法集合[图]    
// 生成透明区域为黑色,其它区域保持不变的位图
图片镂空算法集合[图]
    SetBkColor(hImageDC, RGB(0,0,0));
图片镂空算法集合[图]    SetTextColor(hImageDC, RGB(
255,255,255));
图片镂空算法集合[图]    BitBlt(hImageDC, 
00, nWidthDest, nHeightDest, hMaskDC, 00, SRCAND);
图片镂空算法集合[图]
图片镂空算法集合[图]    
// 透明部分保持屏幕不变,其它部分变成黑色
图片镂空算法集合[图]
    SetBkColor(hdcDest,RGB(255,255,255));
图片镂空算法集合[图]    SetTextColor(hdcDest,RGB(
0,0,0));
图片镂空算法集合[图]     BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hMaskDC, 
00, SRCAND);
图片镂空算法集合[图]
图片镂空算法集合[图]    
// "或"运算,生成最终效果
图片镂空算法集合[图]
    BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hImageDC, 00, SRCPAINT);
图片镂空算法集合[图]
图片镂空算法集合[图]    
// 清理、恢复    
图片镂空算法集合[图]
    SelectObject(hImageDC, hOldImageBMP);
图片镂空算法集合[图]    DeleteDC(hImageDC);
图片镂空算法集合[图]    SelectObject(hMaskDC, hOldMaskBMP);
图片镂空算法集合[图]    DeleteDC(hMaskDC);
图片镂空算法集合[图]    DeleteObject(hImageBMP);
图片镂空算法集合[图]    DeleteObject(hMaskBMP);
图片镂空算法集合[图]}
 
图片镂空算法集合[图]
图片镂空算法集合[图]
图片镂空算法集合[图]
//用于没有掩码图,只有指定透明色,可以进行伸缩
图片镂空算法集合[图]
void CCommon::DrawTransBitmap( HDC hdcDest,      // 目标DC
图片镂空算法集合[图]
                     int nXOriginDest,   // 目标X偏移
图片镂空算法集合[图]
                     int nYOriginDest,   // 目标Y偏移
图片镂空算法集合[图]
                     int nWidthDest,     // 目标宽度
图片镂空算法集合[图]
                     int nHeightDest,    // 目标高度
图片镂空算法集合[图]
                     HDC hdcSrc,         // 源DC
图片镂空算法集合[图]
                     int nXOriginSrc,    // 源X起点
图片镂空算法集合[图]
                     int nYOriginSrc,    // 源Y起点
图片镂空算法集合[图]
                     int nWidthSrc,      // 源宽度
图片镂空算法集合[图]
                     int nHeightSrc,     // 源高度
图片镂空算法集合[图]
                     COLORREF crTransparent  // 透明色,COLORREF类型
图片镂空算法集合[图]
                     )
图片镂空算法集合[图]...
{
图片镂空算法集合[图]    HBITMAP hOldImageBMP, hImageBMP 
= CreateCompatibleBitmap(hdcDest, nWidthDest, nHeightDest);    // 创建兼容位图
图片镂空算法集合[图]
    HBITMAP hOldMaskBMP, hMaskBMP = CreateBitmap(nWidthDest, nHeightDest, 11, NULL);            // 创建单色掩码位图
图片镂空算法集合[图]
    HDC        hImageDC = CreateCompatibleDC(hdcDest);
图片镂空算法集合[图]    HDC        hMaskDC 
= CreateCompatibleDC(hdcDest);
图片镂空算法集合[图]    hOldImageBMP 
= (HBITMAP)SelectObject(hImageDC, hImageBMP);
图片镂空算法集合[图]    hOldMaskBMP 
= (HBITMAP)SelectObject(hMaskDC, hMaskBMP);
图片镂空算法集合[图]    
图片镂空算法集合[图]    
// 将源DC中的位图拷贝到临时DC中
图片镂空算法集合[图]
    if (nWidthDest == nWidthSrc && nHeightDest == nHeightSrc)
图片镂空算法集合[图]    ...
{
图片镂空算法集合[图]        BitBlt(hImageDC, 
00, nWidthDest, nHeightDest, hdcSrc, nXOriginSrc, nYOriginSrc, SRCCOPY);
图片镂空算法集合[图]    }

图片镂空算法集合[图]    
else
图片镂空算法集合[图]    ...
{
图片镂空算法集合[图]        StretchBlt(hImageDC, 
00, nWidthDest, nHeightDest, 
图片镂空算法集合[图]        hdcSrc, nXOriginSrc, nYOriginSrc, nWidthSrc, nHeightSrc, SRCCOPY);
图片镂空算法集合[图]    }

图片镂空算法集合[图]    
图片镂空算法集合[图]    
// 设置透明色
图片镂空算法集合[图]
    SetBkColor(hImageDC, crTransparent);
图片镂空算法集合[图]
图片镂空算法集合[图]    
// 生成透明区域为白色,其它区域为黑色的掩码位图
图片镂空算法集合[图]
    BitBlt(hMaskDC, 00, nWidthDest, nHeightDest, hImageDC, 00, SRCCOPY);
图片镂空算法集合[图]    
图片镂空算法集合[图]    
// 生成透明区域为黑色,其它区域保持不变的位图
图片镂空算法集合[图]
    SetBkColor(hImageDC, RGB(0,0,0));
图片镂空算法集合[图]    SetTextColor(hImageDC, RGB(
255,255,255));
图片镂空算法集合[图]    BitBlt(hImageDC, 
00, nWidthDest, nHeightDest, hMaskDC, 00, SRCAND);
图片镂空算法集合[图]
图片镂空算法集合[图]    
// 透明部分保持屏幕不变,其它部分变成黑色
图片镂空算法集合[图]
    SetBkColor(hdcDest,RGB(0xff,0xff,0xff));
图片镂空算法集合[图]    SetTextColor(hdcDest,RGB(
0,0,0));
图片镂空算法集合[图]    BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hMaskDC, 
00, SRCAND);
图片镂空算法集合[图]    
图片镂空算法集合[图]    
// "或"运算,生成最终效果
图片镂空算法集合[图]
    BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hImageDC, 00, SRCPAINT);
图片镂空算法集合[图]    
图片镂空算法集合[图]    SelectObject(hImageDC, hOldImageBMP);
图片镂空算法集合[图]    DeleteDC(hImageDC);
图片镂空算法集合[图]    SelectObject(hMaskDC, hOldMaskBMP);
图片镂空算法集合[图]    DeleteDC(hMaskDC);
图片镂空算法集合[图]    DeleteObject(hImageBMP);
图片镂空算法集合[图]    DeleteObject(hMaskBMP);
图片镂空算法集合[图]    
图片镂空算法集合[图]}

图片镂空算法集合[图]
图片镂空算法集合[图]
图片镂空算法集合[图]
指定掩码图,和掩码图属于不同图片
图片镂空算法集合[图]
void CCommon::DrawTransBitmap( HDC hdcDest,      // 目标DC
图片镂空算法集合[图]
                    int nXOriginDest,   // 目标X偏移
图片镂空算法集合[图]
                    int nYOriginDest,   // 目标Y偏移
图片镂空算法集合[图]
                    int nWidthDest,     // 目标宽度
图片镂空算法集合[图]
                    int nHeightDest,    // 目标高度
图片镂空算法集合[图]
                    HDC hdcSrc,         // 源DC
图片镂空算法集合[图]
                    HDC hdcMask,
图片镂空算法集合[图]                    
int nXOriginSrc,    // 源X起点
图片镂空算法集合[图]
                    int nYOriginSrc,    // 源Y起点
图片镂空算法集合[图]
                    COLORREF crTransparent  // 透明色,COLORREF类型
图片镂空算法集合[图]
                    )
图片镂空算法集合[图]...
{
图片镂空算法集合[图]
图片镂空算法集合[图]    HBITMAP hOldImageBMP, hImageBMP 
= CreateCompatibleBitmap(hdcDest, nWidthDest, nHeightDest);    // 创建兼容位图
图片镂空算法集合[图]
     HDC        hImageDC = CreateCompatibleDC(hdcDest);//临时DC 
图片镂空算法集合[图]
     hOldImageBMP = (HBITMAP)SelectObject(hImageDC, hImageBMP);
图片镂空算法集合[图] 
图片镂空算法集合[图]    
// 将源DC中的位图拷贝到临时DC中,源DC已经载入位图
图片镂空算法集合[图]
     BitBlt(hImageDC, 00, nWidthDest, nHeightDest, hdcSrc, nXOriginSrc, nYOriginSrc, SRCCOPY);
图片镂空算法集合[图]     
// 设置临时DC的透明色
图片镂空算法集合[图]
    SetBkColor(hImageDC, crTransparent);
图片镂空算法集合[图]    
// 生成透明区域为黑色,其它区域保持不变的位图
图片镂空算法集合[图]
    SetBkColor(hImageDC, RGB(0,0,0));
图片镂空算法集合[图]    SetTextColor(hImageDC, RGB(
255,255,255));
图片镂空算法集合[图]    BitBlt(hImageDC, 
00, nWidthDest, nHeightDest, hdcMask, 00, SRCAND);
图片镂空算法集合[图]    
// 透明部分保持屏幕不变,其它部分变成黑色
图片镂空算法集合[图]
    SetBkColor(hdcDest,RGB(255,255,255));
图片镂空算法集合[图]    SetTextColor(hdcDest,RGB(
0,0,0));
图片镂空算法集合[图]     BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hdcMask, 
00, SRCAND);
图片镂空算法集合[图]     
// "或"运算,生成最终效果
图片镂空算法集合[图]
    BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hImageDC, 00, SRCPAINT);
图片镂空算法集合[图]    
// 清理、恢复    
图片镂空算法集合[图]
    SelectObject(hImageDC, hOldImageBMP);
图片镂空算法集合[图]    DeleteDC(hImageDC);
图片镂空算法集合[图]    DeleteObject(hImageBMP);
图片镂空算法集合[图]}
 
图片镂空算法集合[图]
图片镂空算法集合[图]
指定图片和掩码图同属于一张图片
图片镂空算法集合[图]
void CCommon::DrawTransBitmap(HDC hDC, int nPosX, int nPosY, int nCX, int nCY, HBITMAP hObj)
图片镂空算法集合[图]...
{
图片镂空算法集合[图]    HDC hMemDC
= CreateCompatibleDC(hDC);
图片镂空算法集合[图]    HBITMAP hOldBMP
=(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);
图片镂空算法集合[图]
图片镂空算法集合[图]}
  
图片镂空算法集合[图]
图片镂空算法集合[图]HRGN CCommon::CreateBitmapRgn(
int nWidth,int nHeight,HBITMAP hbmp, COLORREF TransColor)
图片镂空算法集合[图]...
{
图片镂空算法集合[图]
图片镂空算法集合[图]        HDC  hmemDC;
图片镂空算法集合[图]        
//创建与传入DC兼容的临时DC
图片镂空算法集合[图]
        hmemDC = ::CreateCompatibleDC(NULL);
图片镂空算法集合[图]        
图片镂空算法集合[图]        HBITMAP hOldBmp 
= (HBITMAP)::SelectObject(hmemDC,hbmp);
图片镂空算法集合[图]        
图片镂空算法集合[图]        
图片镂空算法集合[图]        
//创建总的窗体区域,初始region为0
图片镂空算法集合[图]
        HRGN hrgn;
图片镂空算法集合[图]        hrgn 
= ::CreateRectRgn(0,0,0,0);
图片镂空算法集合[图]           
图片镂空算法集合[图]        
图片镂空算法集合[图]        
int y;
图片镂空算法集合[图]        
for(y=0;y<nHeight ;y++)
图片镂空算法集合[图]        ...
{
图片镂空算法集合[图]            HRGN rgnTemp; 
//保存临时region
图片镂空算法集合[图]
            
图片镂空算法集合[图]            
int iX = 0;
图片镂空算法集合[图]            
do
图片镂空算法集合[图]            ...
{
图片镂空算法集合[图]                
//跳过透明色找到下一个非透明色的点.
图片镂空算法集合[图]
                while (iX < nWidth  && ::GetPixel(hmemDC,iX, y) == TransColor)
图片镂空算法集合[图]                    iX
++;
图片镂空算法集合[图]                
图片镂空算法集合[图]                
//记住这个起始点
图片镂空算法集合[图]
                int iLeftX = iX;
图片镂空算法集合[图]                
图片镂空算法集合[图]                
//寻找下个透明色的点
图片镂空算法集合[图]
                while (iX < nWidth  && ::GetPixel(hmemDC,iX, y) != TransColor)
图片镂空算法集合[图]                    
++iX;
图片镂空算法集合[图]                
图片镂空算法集合[图]                
//创建一个包含起点与重点间高为1像素的临时“region”
图片镂空算法集合[图]
                rgnTemp=::CreateRectRgn(iLeftX, y, iX, y+1);
图片镂空算法集合[图]                
图片镂空算法集合[图]                
//合并到主"region".
图片镂空算法集合[图]
                CombineRgn( hrgn,hrgn,rgnTemp, RGN_OR);
图片镂空算法集合[图]                
图片镂空算法集合[图]                
//删除临时"region",否则下次创建时和出错
图片镂空算法集合[图]
                ::DeleteObject(rgnTemp);
图片镂空算法集合[图]            }
while(iX <nWidth );
图片镂空算法集合[图]            iX 
= 0;
图片镂空算法集合[图]        }

图片镂空算法集合[图]        
图片镂空算法集合[图]
图片镂空算法集合[图]        ::SelectObject(hmemDC,hOldBmp);
图片镂空算法集合[图]        ::DeleteDC(hmemDC);
图片镂空算法集合[图]
图片镂空算法集合[图]        
return hrgn;
图片镂空算法集合[图]    
图片镂空算法集合[图]}

图片镂空算法集合[图]

 

 

上一篇: 系统服务列表chaoqianshishang_NetBar系统服务列表
下一篇: XBRL流行工具分析与比较-第一部分

关于我们 | 联系我们 | 加入我们 | 广告服务 | 投诉意见 | 网站导航
Copyright © 2000-2011 21tx.com, All Rights Reserved.
晨新科技 版权所有 Created by TXSite.net