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相关的。比如device24位色/32位色/自下而上绘制的/使用颜色掩码,则获取到的pixel也是这样的的,

: 此处CBitmapDDB图形。不能使用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  转载请注明出处 

 

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

posted @ 2015-07-29 16:48  lcchuguo  阅读(322)  评论(0编辑  收藏  举报