用MASK方法传送不规则位图

原创 2003年03月24日 09:17:00
#define    FORE_ROP3(ROP4)        (0x00FFFFFF&(ROP4))
#define    BACK_ROP3(ROP4)        (ROP3FromIndex(SwapROP3_SrcDst(BYTE((ROP4)>>24))))
#define DSTCOPY 0x00AA0029
#define DSTERASE 0x00220326 // dest = dest & (~src) : DSna

BOOL WINAPI MyMaskBlt(HDC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight,
    HDC hdcSrc, int nXSrc, int nYSrc,
    HBITMAP hbmMask, int xMask, int yMask,
    DWORD dwRop
)
{
    if ( hbmMask == NULL )
        return BitBlt(hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, 
                      nXSrc, nYSrc, FORE_ROP3(dwRop));

    // 1. make mask bitmap's dc
    HDC hDCMask = ::CreateCompatibleDC(hdcDest);
    HBITMAP hOldMaskBitmap = (HBITMAP)::SelectObject(hDCMask, hbmMask);
    ASSERT ( hOldMaskBitmap );

    // 2. make masked Background bitmap

    // 2.1 make bitmap
    HDC hDC1 = ::CreateCompatibleDC(hdcDest);
    ASSERT ( hDC1 );
    HBITMAP hBitmap2 = ::CreateCompatibleBitmap(hdcDest, nWidth, nHeight);
    HBITMAP hOldBitmap2 = (HBITMAP)::SelectObject(hDC1, hBitmap2);
    ASSERT ( hOldBitmap2 );

    // 2.2 draw dest bitmap and mask
    DWORD dwRop3 = BACK_ROP3(dwRop);
    ::BitBlt(hDC1, 0, 0, nWidth, nHeight, hdcSrc, nXSrc, nYSrc, SRCCOPY);
    ::BitBlt(hDC1, 0, 0, nWidth, nHeight, hdcDest, nXDest, nYDest, dwRop3);
    ::BitBlt(hDC1, 0, 0, nWidth, nHeight, hDCMask, xMask, yMask, DSTERASE);

    // 3. make masked Foreground bitmap

    // 3.1 make bitmap
    HDC hDC2 = ::CreateCompatibleDC(hdcDest);
    ASSERT ( hDC2 );
    HBITMAP hBitmap3 = ::CreateCompatibleBitmap(hdcDest, nWidth, nHeight);
    HBITMAP hOldBitmap3 = (HBITMAP)::SelectObject(hDC2, hBitmap3);
    ASSERT ( hOldBitmap3 );

    // 3.2 draw src bitmap and mask
    dwRop3 = FORE_ROP3(dwRop);
    ::BitBlt(hDC2, 0, 0, nWidth, nHeight, hdcDest, nXDest, nYDest, SRCCOPY);
    ::BitBlt(hDC2, 0, 0, nWidth, nHeight, hdcSrc, nXSrc, nYSrc, dwRop3);
    ::BitBlt(hDC2, 0, 0, nWidth, nHeight, hDCMask, xMask, yMask, SRCAND);

    // 4. combine two bitmap and copy it to hdcDest
    ::BitBlt(hDC1, 0, 0, nWidth, nHeight, hDC2, 0, 0, SRCPAINT);
    ::BitBlt(hdcDest, nXDest, nYDest, nWidth, nHeight, hDC1, 0, 0, SRCCOPY);

    // 5. restore all object
    ::SelectObject(hDCMask, hOldMaskBitmap);
    ::SelectObject(hDC1, hOldBitmap2);
    ::SelectObject(hDC2, hOldBitmap3);

    // 6. delete all temp object
    DeleteObject(hBitmap2);
    DeleteObject(hBitmap3);

    DeleteDC(hDC1);
    DeleteDC(hDC2);
    DeleteDC(hDCMask);

    return TRUE;
}

把一个bmp转换成cur显示出来(掩码mask)

创建一个ICON需要两个掩码位图,AND and XOR masks这个可以从typedef struct _ICONINFO { BOOL fIcon; DWORD xHotspot; ...
  • hgy413
  • hgy413
  • 2011年06月23日 16:24
  • 2411

MaskBlt_百度百科

MaskBlt 开放分类: 编程、计算机、API 函数功能:该函数使用特定的掩码和光栅操作来对源和目标位图的颜色数据进行组合。 函数原型:BOOL MaskBlt(HDC hdcDest, int n...
  • goxigo
  • goxigo
  • 2008年05月13日 11:28
  • 311

OpenCV生成不规则mask

原文地址:http://www.cnblogs.com/xiangshancuizhu/archive/2011/11/16/2251227.html 在OpenCV中文论坛上很多人问到这样的问...
  • roslei
  • roslei
  • 2016年08月16日 09:54
  • 1192

绘制不规则位图方法总结,多种实现方法,全面测试比较!

        首先要说的是,所谓不规则位图的绘制,意思是说一张位图(位图永远是规则的),上面有个不规则图形,把这张位图绘制到某一界面上时,要求只绘制位图上那个不规则图形,其它地方保持背景不变。比如说...
  • yang79tao
  • yang79tao
  • 2004年07月03日 18:52
  • 2001

OpenCV生成不规则ROI另一法

相关代码,比较简单,一看就懂: [cpp] view plain copy Mat srcImg = imread("lena.jpg");  Mat dstImg;  ...
  • roslei
  • roslei
  • 2016年09月02日 17:13
  • 489

使用opencv中cvCopy的mask参数实现对不规制图形的提取

关于cvCopy函数的内容摘抄了本文的博客文章,在这里 。   一、cvcopy函数的简介   cvCopy 这个函数很熟洗哈,用得很多吧哈哈…… 以下内容来子opencv安装...
  • jazywoo123
  • jazywoo123
  • 2013年12月10日 00:24
  • 1382

不规则roi

原文:http://www.cnblogs.com/xiangshancuizhu/archive/2011/11/16/2250931.html A few days ago, a reade...
  • moonwindhui
  • moonwindhui
  • 2015年06月28日 18:39
  • 205

cocos2d-X 显示不规则图片方法(遮罩)

cocos2d-X 显示不规则图片方法(遮罩) 2012-11-16 19:32:21 标签:不规则 cocos2dx 遮罩 原创作品,允许转载,转载时请务必以超链接形式标明文章 原...
  • love_hot_girl
  • love_hot_girl
  • 2013年03月18日 18:49
  • 1395

bitmaps位图和mask掩码常用操作

/** * bitmaps位图和 mask掩码 */ public class BitmapsAndMask { final int BIT5 = (15); final int ...
  • shilu89757
  • shilu89757
  • 2016年04月07日 14:30
  • 377

opencv中生成不规则的Mask

opencv有一系列函数支持掩膜处理,即函数只对掩膜值为255的像素点进行操作,从而实现对图像某个区域的处理。 但有一个缺点是,掩膜都是矩形的,有时候希望是别的几何图形甚至是不规则图形。例如一个旋转...
  • Kelvin_Yan
  • Kelvin_Yan
  • 2015年09月09日 15:35
  • 1872
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用MASK方法传送不规则位图
举报原因:
原因补充:

(最多只允许输入30个字)