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 转载请注明出处
版权声明:本文博客原创文章,博客,未经同意,不得转载。