MFC漆摘要-截图,获得DIB/DDB图形Pixel
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的更多相关文章
- VS2010/MFC编程入门之四十九(图形图像:CDC类及其屏幕绘图函数)
上一节中鸡啄米讲了文本输出的知识,本节的主要内容是CDC类及其屏幕绘图函数. CDC类简介 CDC类是一个设备上下文类. CDC类提供了用来处理显示器或打印机等设备上下文的成员函数,还有处理与窗口客户 ...
- MFC画图总结-DIB图形绘制
參考文档: http://blog.csdn.net/hnust_xiehonghao/article/details/37652927 http://blog.sina.com.cn/s/blog_ ...
- DDB与DIB的区别
DDB(设备相关位图) DDB依赖于具体设备:DDB的颜色模式必需与输出设备相一致.例如,如果当前的显示设备是256色模式,那么DDB必然也是256色的.在256色以下的位图中存储的像素值是系统调色板 ...
- MFC图形编辑器
前言 vs2015竟然可以完美打开工程,哈哈可以直接生成类图了.由于内容较多,所以根据内容的重要性会安排详略. https://github.com/bajdcc/GraphEditor/releas ...
- 依赖于设备的位图(DDB) ,CreateCompatibleBitmap用法
DDB(Device-dependent bitmap)依赖于具体设备,这主要体现在以下两个方面: DDB的颜色模式必需与输出设备相一致.例如,如果当前的显示设备是256色模式,那么DDB必然也是25 ...
- mfc ui3
引用:http://www.cnblogs.com/rainbowzc/archive/2010/06/02/1749872.html 本文专题讨论VC中的界面美化,适用于具有中等VC水平的读者.读者 ...
- VS2010/MFC编程入门教程之目录和总结
鸡啄米的这套VS2010/MFC编程入门教程到此就全部完成了,虽然有些内容还未涉及到,但帮助大家进行VS2010/MFC的入门学习业已足够.以此教程的知识为基础,学习VS2010/MFC较为深入的内容 ...
- MFC教程
MFC教程 还有VS2015的视频教程 试看教程地址:http://dwz.cn/4PcfPk免费下载地址:http://dwz.cn/mfc888 一.VS2010/MFC编程入门教程之目录 第一部 ...
- 【GDI+】MFC画图- 消除锯齿(转)
原文转自 https://wenku.baidu.com/view/b5460979700abb68a982fbcf.html 在常规条件下,MFC画出来的图形.文字都是有锯齿的.如下图所示: 怎样才 ...
随机推荐
- NET5
ASP.NET5(RC1) - 翻译 前言 ASP.NET 5 是一次令人惊叹的对于ASP.NET的创新革命. 他将构建目标瞄准了 .NET Core CLR, 同时ASP.NET又是对于云服务进行优 ...
- C语言常用的宏
01: 防止一个头文件被重复包含 #ifndef COMDEF_H #define COMDEF_H //头文件内容 #endif 02: 重新定义一些类型,防止由于各种平台和编译器的不同,而产生的类 ...
- IOT表优缺点
<pre name="code" class="html">IOT表是将所有东西都塞到叶块中,表就是索引,可以避免回表 首先,对于IOT而言,只有索 ...
- [每日一题] 11gOCP 1z0-052 :2013-09-5 runInstaller oracle of no swap
转载请注明出处:http://blog.csdn.net/guoyjoe/article/details/11186995 正确答案:A 我们先来看下面这张截图,这是我在安装Oracle 11.2.0 ...
- Access Violation at address 00000000.Read of address 00000000 解决办法
是数组越标或没有初始化某个对象之类的问题,搂住细细检查一下代码, 使用指针前未做检查,而这个指针未初始化. 可能是new后没有delete,这样出现溢出的可能性比较大 检查代码或者跟踪试试 使 ...
- [Android学习笔记]自定义控件的使用
自定义控件时,最好抽象得彻底,并且编写需严谨,因为可能程序中多处都会引用到它,或者提供给团队中的其他人使用. 其一般步骤为: 1.创建控件的类文件,定义其功能逻辑.一般继承自现有控件或者View2.在 ...
- 小心LinkedHashMap的get()方法(转)
这是一个来自实际项目的例子,在这个案例中,有同事基于jdk中的LinkedHashMap设计了一个LRUCache,为了提高性能,使用了 ReentrantReadWriteLock 读写锁:写锁对应 ...
- IOCP模型与网络编程
IOCP模型与网络编程 一.前言: 在老师分配任务(“尝试利用IOCP模型写出服务端和客户端的代码”)给我时,脑子一片空白,并不知道什么是IOCP模型,会不会是像软件设计模式里面的工厂模 ...
- Android内存管理
首先Android理机制相当复杂.想要讲清楚比較困难.其次对于绝大多数用户来说.仅仅关心内存够不够用,至于内存怎样管理的这样的技术细节,不是用户须要去考虑的,写这样一个专题有没有意义?毕竟我们是用手机 ...
- Jobbox.io(职位盒子): 新兴的面向技术人才的职场招聘众推平台
人才招聘市场一个主要问题在于猎头中介费昂贵.这对于大公司而言,或可接受. 但对于海量小微企业而言招聘成本和效率之间的平衡是非常大的一个问题. 现在产品猎场(Product Hunt)上出现了一些新的招 ...