1.       当前Screen进行Copy屏幕,获得BITMAP

当前屏幕Copy。须要获取当前屏幕的HDC,

一种是直接从屏幕DC抓原始图。

一种是然后使用兼容MemDC进行抓图,然后能够附加图形的相关处理,如调整大小。如把鼠标绘制上去等。

(注:假设是对当前程序Copy屏幕的话。传入GetDC參数使用 this->getsafehwnd())

(注:假设对指定窗体Copy屏幕的话,能够用Spy++获取窗体HWND,然后传入GetDC)

对于从程序抓原始图的方式比式比較简单,比如:

// 获取当前屏幕HDC

HDC hScreenDC = ::GetDC(NULL);

// 直接获取当前DC相应的BITMAP

HBITMAP hBmp = (HBITMAP) GetCurrentObject (hScreen, OBJ_BITMAP);

对于使用兼容DC抓图的样例例如以下,比如:

// 获取当前屏幕HDC
HDC hScreenDC = ::GetDC(NULL);
// 创建兼容HDC
HDC hMemDC = ::CreateCompatibleDC(hScreenDC)
// 创建兼容位图
HBITMAP hbm = CreateCompatibleBitmap(hScreenDC, width, height);
// 为MemDC选中兼容为图
HBITMAP oldbm = (HBITMAP) SelectObject(hMemDC, hbm);
// 复制图片像素内容
BitBlt(hMemDC, 0, 0, width, height, hScreenDC, left, top, SRCCOPY);
// 假设须要绘制鼠标信息的话
{//Draw the Cursor
ICONINFO iconinfo ;
BOOL ret;
ret = GetIconInfo( hcur, &iconinfo );
if (ret) {
xPoint.x -= iconinfo.xHotspot;
xPoint.y -= iconinfo.yHotspot;
//need to delete the hbmMask and hbmColor bitmaps
//otherwise the program will crash after a while after running out of resource
if (iconinfo.hbmMask) DeleteObject(iconinfo.hbmMask);
if (iconinfo.hbmColor) DeleteObject(iconinfo.hbmColor);
}
::DrawIcon( hMemDC, xPoint.x, xPoint.y, hcur);
}
// 设置回原有的DC绑定位图
SelectObject(hMemDC,oldbm);

2.       获取DDB图形Pixel

DDB-Device dependency bitmap设备依赖图形

由于当前Bitmap都是通过DC获取的,所以都是DDB类型的图形。

通过CBitmap的函数GetBitmapBits,获取到相关bits内容,或者也能够使用GetBitmap获取整个BITMAP结构信息。

但获取到的这个pixel信息是和当前device相关的。比如device是24位色/32位色/自下而上绘制的/使用颜色掩码,则获取到的pixel也是这样的的,

注: 此处CBitmap为DDB图形。不能使用CImage进行CImage::GetBits获取Pixel,详见CImage::
IsDIBSection说明。同一时候,假设要保存图形的话,能够借用CImage:: Save来保存图形。

比如:

// 绑定hbmp

CBitmap bitmap;

Bitmap.attach(hBmp);

// 申请内存

byte pBuffer = new [width * 4 * height];

// 获取bits信息

Bitmap. GetBitmapBits(pBuffer);

3.       获取DIB图形Pixel

DIB-Device Independency Bitmap设备无关图形

这类图形,本身结构中具备了图形颜色位数/颜色表/颜色掩码说明相关的信息,所以就能够不依赖于从社备中查询这些信息,也称为设备无关图形。

从HBitmap获取DIB图形的函数经常使用GetDIBits。

GetDIBBits一方面能够用于查询出当前设备的结构信息,填入DIB头信息BITMAPINFO说明中;

还有一方面。能够指定BITMAPINFO/指定图形格式,从Bitmap中转换出指定格式的图形信息。

所以它的使用方法有两种:

1.      一种是获取Device中的格式,然后填入到BItmapInfo,然后基于该BitmapInfo,获取Pixel信息

2.      还有一种是,直接指定Bitmapinfo。获取基于指定格式转换后Pixsel信息

比如,我们兼或考虑这两种。先获取设备BitmapInfo,然后对格式进行改动,再获取改动格式后的图形Pixel

// 初始化空白PBITMAPINFO

LPBITMAPINFO lpBitmapInfo = (BITMAPINFO*)malloc(sizeof(BITMAPINFO)+256 * sizeof(RGBQUAD));

memset(lpBitmapInfo, 0, sizeof(BITMAPINFO)+256 * sizeof(RGBQUAD));

lpBitmapInfo->bmiHeader.biSize = sizeof(lpBitmapInfo->bmiHeader);

// lpvBits使用NULL查询位图DIB信息

if (GetDIBits(hMemDC, hBmp, 0, 0, NULL, lpBitmapInfo, DIB_RGB_COLORS))

{

         // 改动格式,使用改动后的格式获数据Pixel数据

lpBitmapInfo->bmiHeader.biCompression = BI_RGB;

         lpBitmapInfo->bmiHeader.biBitCount = 24;

         // 查询位图DIB信息

         GetDIBits(hMemDC, (HBITMAP)cBitmap.GetSafeHandle(), 0, nHeight, pBuffer, lpBitmapInfo, DIB_RGB_COLORS);

}

// 处理完成删除头信息

delete lpBitmapInfo;

Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu  转载请注明出处

版权声明:本文博客原创文章,博客,未经同意,不得转载。

MFC漆摘要-截图,获得DIB/DDB图形Pixel的更多相关文章

  1. VS2010/MFC编程入门之四十九(图形图像:CDC类及其屏幕绘图函数)

    上一节中鸡啄米讲了文本输出的知识,本节的主要内容是CDC类及其屏幕绘图函数. CDC类简介 CDC类是一个设备上下文类. CDC类提供了用来处理显示器或打印机等设备上下文的成员函数,还有处理与窗口客户 ...

  2. MFC画图总结-DIB图形绘制

    參考文档: http://blog.csdn.net/hnust_xiehonghao/article/details/37652927 http://blog.sina.com.cn/s/blog_ ...

  3. DDB与DIB的区别

    DDB(设备相关位图) DDB依赖于具体设备:DDB的颜色模式必需与输出设备相一致.例如,如果当前的显示设备是256色模式,那么DDB必然也是256色的.在256色以下的位图中存储的像素值是系统调色板 ...

  4. MFC图形编辑器

    前言 vs2015竟然可以完美打开工程,哈哈可以直接生成类图了.由于内容较多,所以根据内容的重要性会安排详略. https://github.com/bajdcc/GraphEditor/releas ...

  5. 依赖于设备的位图(DDB) ,CreateCompatibleBitmap用法

    DDB(Device-dependent bitmap)依赖于具体设备,这主要体现在以下两个方面: DDB的颜色模式必需与输出设备相一致.例如,如果当前的显示设备是256色模式,那么DDB必然也是25 ...

  6. mfc ui3

    引用:http://www.cnblogs.com/rainbowzc/archive/2010/06/02/1749872.html 本文专题讨论VC中的界面美化,适用于具有中等VC水平的读者.读者 ...

  7. VS2010/MFC编程入门教程之目录和总结

    鸡啄米的这套VS2010/MFC编程入门教程到此就全部完成了,虽然有些内容还未涉及到,但帮助大家进行VS2010/MFC的入门学习业已足够.以此教程的知识为基础,学习VS2010/MFC较为深入的内容 ...

  8. MFC教程

    MFC教程 还有VS2015的视频教程 试看教程地址:http://dwz.cn/4PcfPk免费下载地址:http://dwz.cn/mfc888 一.VS2010/MFC编程入门教程之目录 第一部 ...

  9. 【GDI+】MFC画图- 消除锯齿(转)

    原文转自 https://wenku.baidu.com/view/b5460979700abb68a982fbcf.html 在常规条件下,MFC画出来的图形.文字都是有锯齿的.如下图所示: 怎样才 ...

随机推荐

  1. How to append files to a .tar archive using Apache Commons Compress?(转)

    I created a copy of the tar archive and copied to entire content to it. Then I delete the old tar ar ...

  2. mongodb查询分页优化

    要求不用skip 前提:1.时间倒序排列(自己现在的项目中也是按照时间倒序排列的)       2.每页显示10条数据 int limit = 10;//刚开始点击查询的时候设置十条 查询形式为 db ...

  3. git版本号回滚

    先说今天遇到的问题,看到一个config.php的配置文件一直在改动的状态下,可是和远程的config.php是不一致的,我不须要提交它,可是看它在 modified的状态下,非常不爽.想删除它.gi ...

  4. ubuntu12.04安装搜狗输入法配置,安装packettracer字体设置,软件推荐

    装上系统,后的各种配置,各种出错之后的解决. 一.安装搜狗输入法 如果系统以前安装了先卸载: sudo apt-get remove fcitx* #删除配置文件 sudo apt-get purge ...

  5. 一个用 C 语言写的迷你版 2048 游戏,仅仅有 500个字符

    Jay Chan 用 C 语言写的一个迷你版 2048 游戏,仅仅有 487 个字符. 来围观吧 M[16],X=16,W,k;main(){T(system("stty cbreak&qu ...

  6. NET平台机器学习组件-Infer.NET

    NET平台机器学习组件-Infer.NET(三) Learner API—数据映射与序列化 阅读目录 关于本文档的说明 1.基本介绍 2.标准数据格式的映射 3.本地数据格式映射 4.评估数据格式映射 ...

  7. LinkedHashMap相关信息介绍(转)

    Java中的LinkedHashMap此实现与 HashMap 的不同之处在于,后者维护着一个运行于所有条目的双重链接列表.此链接列表定义了迭代顺序,该迭代顺序通常就是将键插入到映射中的顺序(插入顺序 ...

  8. gant

    http://gant.github.io/ http://gant.codehaus.org/

  9. isapi_rewrite运行在.net framework 4.0+iis 6.0环境下404错误解决方案

    今天以前的同事让我帮他上服务器看看,他把页面伪静态之后,出现404错误,为什么会出现这样的问题呢,仔细研究才发现,原因如下: 因为ASP.NET4.0在安装的过程中,已经在IIS6做了一些手脚,让它可 ...

  10. 在WIN7系统的笔记本上建立WIFI热点

        成功与否的关键在于你是否依照顺序运行:       前置条件:右键"我的电脑"--"属性"--"设备管理器"--"网络适配 ...