图片镂空算法集合[图](转)

原文:http://www.cnblogs.com/carekee/articles/2179004.html

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

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

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, 1, 1, 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, 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( 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, 1, 1, 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, 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( 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, 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(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;
    
}

图片镂空算法集合[图](转)相关推荐

  1. java tif切割成瓦片_将图片切割成瓦片图-(算法+实现)

    [实例简介] 介绍:https://blog.csdn.net/STRIVEYe/article/details/88388072 [实例截图] [核心代码] 919ed105-5c0c-4f11-a ...

  2. 特征图注意力_从数据结构到算法:图网络方法初探

    作者 | 朱梓豪 来源 | 机器之心 原文 | 从数据结构到算法:图网络方法初探 如果说 2019 年机器学习领域什么方向最火,那么必然有图神经网络的一席之地.其实早在很多年前,图神经网络就以图嵌入. ...

  3. 10个相似图片搜索以图找图的网站

    有没有遇到过:看到一张图片,想找到它的原始图片,或者是凭着一张小的缩略图找出原始大图?不管你有没有遇到过,反正我是遇到了.不过现在不担心了,因为下面的十款搜索引擎可以帮你实现,以图找图,以图搜图,以图 ...

  4. 数据结构与算法之图的应用

    数据结构与算法之图的应用 图的定义和基本概念 图的实现 数组〈邻接矩阵〉 邻接表 图的应用 最小生成树 Prim(普里姆)算法 Kruskal(克鲁斯卡尔)算法 最短路径 迪克斯特拉算法 拓扑排序 执 ...

  5. [PPTX解析] 图片效果算法篇:重新着色

    PPTX解析:重新着色 PPT对图片进行重新着色和设置透明颜色这两个行为,并不会对原图进行修改,而是通过将修改信息直接存入xml中,并在加载图片时通过计算将效果渲染出来.由于PPT不会存储一张经过该效 ...

  6. Unity图片转换为法线贴图

    Unity图片转换为法线贴图 using UnityEngine; using System.IO; using UnityEditor;public class NormalTexture : Mo ...

  7. 数据结构与算法--符号图

    数据结构与算法--符号图 为了计算简单,传统的图中,都是使用整数来表示顶点,这样难免会有点抽象,不能直接反映各个顶点代表的信息.在实际生活中,使用图时一般会建立一个一一对应的关系表,如下 顶点 0 1 ...

  8. 213维恩图和集合图(VennUpset)

    维恩图和集合图 本节作者:徐俊,北京大学人民医院 版本1.0.5,更新日期:2020年6月30日 本项目永久地址:https://github.com/YongxinLiu/MicrobiomeSta ...

  9. 十大排序算法 导图总结

    以下为我们经常用到的十大典型排序算法导图,很多设计以及优化的思想值得去参考学习 因为代码较多,所以都添加到对应的实现注释中了,相关代码可以从Mind-mapping获取xmind源文件 参考文档: 基 ...

最新文章

  1. 如何在Windows中安装Python?
  2. 同一个网站,手机端跟电脑端显示不同是怎么实现的?...
  3. python入门视频教程推荐-Python入门视频看哪个好?适合初学者的教学视频推荐
  4. 【数据可视化应用】华夫饼型柱状图(附R语言代码)
  5. python传文件给堡垒机上远程的另一个机器_如何用hive调度堡垒机上的python脚本...
  6. vue 左侧菜单隐藏_vue.js 左侧二级菜单显示与隐藏切换的实例代码
  7. 再来一波不错的学习资源
  8. linux-用户与组的概念
  9. MyEclipse打开闪退
  10. Cookie和Session专题
  11. python面试 hashmap是什么_Java HashMap与Hashtable的区别是什么?
  12. leetcode[81]Search in Rotated Sorted Array II
  13. PSPnet网络结构搭建
  14. PostgreSQL数据库
  15. 带你全面掌握高级知识点!如何化身BAT面试收割机
  16. TCP与UPD的比较
  17. MySQL--基于Xtrabackup+Shell+Crond实现的数据库(全量+增量)热备份方案
  18. python截图工具和模拟鼠标键盘_python PyAutoGUI 模拟鼠标键盘操作和截屏功能
  19. DSP在SYS/BIOS下串口(UART)接收之环形队列
  20. apache服务器wind 下载,安装及部署

热门文章

  1. JavaWeb开发模式:C/S模式,B/S模式,JSP+JavaBean模式,JSP+Servlet+JavaBean模式
  2. curl head请求_CURL速查
  3. LeetCode精讲 03无重复字符的最长子串(滑动窗口)
  4. 从 WordCount 到文档的倒排索引详解
  5. 枚举法用于逻辑问题的处理
  6. 如何用计算机声卡,声卡是什么,详细教您怎么查看自己电脑的声卡
  7. ksql 数量大于2_别人1加1大于2大于3,雍禾植发1加1小于2……
  8. soap php 分开类,将请求处理到同一PHP SOAP服务器中的多个类
  9. html倒计时timer,JavaScript定时器设置、使用与倒计时案例详解
  10. 查看linux mysql 账户权限设置_Linux下mysql新建账号及权限设置各种方式总结