网络上七平八凑的,运行后Getdibits这块出错,应该是位图信息头初始化这块没做好
#include
#include
#include
usingnamespacestd;
//使用多字节字符集:项目>最后一项>配置属性>常规里设置
voidgetrgb(LPRECTlpRect)
{
HDChScrDC,hMemDC;//声明屏幕和内在设备描述表
HBITMAPhBitmap,hOldBitmap;//新老位图句柄
intnX,nY,nX2,nY2;//选定区域坐标
intnWidth,nHeight;//位图宽度和高度
intxScrn,yScrn;//屏幕分辨率
intcolorcount;//调色板项数
//if(IsRectEmpty(lpRect))//确保选定区域不为空矩形
//returnNULL;
hScrDC=CreateDC("DISPLAY",NULL,NULL,NULL);//为屏幕创建设备描述表
hMemDC=CreateCompatibleDC(hScrDC);
//为屏幕设备描述表创建兼容的内存设备描述表
//GetDIBits
nX=lpRect->left;//获得选定区域坐标
nY=lpRect->top;
nX2=lpRect->right;
nY2=lpRect->bottom;
xScrn=GetDeviceCaps(hScrDC,HORZRES);//获得屏幕分辨率
yScrn=GetDeviceCaps(hScrDC,VERTRES);
colorcount=GetDeviceCaps(hScrDC,NUMCOLORS);//当前设备颜色项目数,超过8位返回-1,没有调色板。
if(nXxScrn)nX2=xScrn;
if(nY2>yScrn)nY2=yScrn;
nWidth=nX2-nX;//获得位图的宽度和高度
nHeight=nY2-nY;
hBitmap=CreateCompatibleBitmap(hScrDC,nWidth,nHeight);
//创建一个与屏幕设备描述表兼容的位图
hOldBitmap=(HBITMAP)SelectObject(hMemDC,hBitmap);
//把新位图选到内存设备描述表中
BitBlt(hMemDC,0,0,nWidth,nHeight,hScrDC,nX,nY,SRCCOPY);
//把屏幕设备描述表拷贝到内存设备描述表中
hBitmap=(HBITMAP)SelectObject(hMemDC,hOldBitmap);
//得到屏幕位图的句柄
BITMAPINFObitmapInfo={0};
//BITMAPINFO结构有两个成员变量,分别是BITMAPINFOHEADER结构和RGBQUAD结构,
//BITMPINFOHEADER结构中包含了图像的一些基本信息,包括宽与高
//我们要先将biSize属性初始为BITMAPINFOHEADER结构的大小,以便GetDIBits函数在调用的时候填充其他的属性变量
bitmapInfo.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
//将hBitmap选入到hMemDC中,通俗点说就是关联起来,对hMemDC的操作也就是对hBitmap操作,
//比如在hMemDC中写入文字在hBitmap中也能体现,常见给图片打水印可以用这个方法实现
GetDIBits(hMemDC,hBitmap,0,nHeight,NULL,&bitmapInfo,DIB_RGB_COLORS);
//根据第一次调用 GetDIBits函数完成后,填充到bitmapInfo中的图像占字节数大小来动态分配内存
//你也可以用图像的宽*高来得到图像所占字节数,但此方法有一点要说明 ,第一行的字节数必须是4的倍数,不够的用0补足。
//例:宽为923像素的图像,923/4 = 230(取整数部分),多出三个字节,这个时候我们就要补足四位,变成(230+1)*4 = 924 实际一行占的字节数
unsignedchar*bitmapBits=newunsignedchar[bitmapInfo.bmiHeader.biSizeImage];
memset(bitmapBits,0,bitmapInfo.bmiHeader.biSizeImage);//初始为0
//第二次调用函数,并且第五个参数为有效的指针且可写入,
//函数调用后,将会把图像的每个像素点的RGB值 以16进制值写入到bitmapBits中,
//常见的一个像素是占4个字节,第一个字节是蓝色--B,第二个字节是绿色--G,第三个字节是红色--R,第四个不知道
GetDIBits(hMemDC,hBitmap,0,nHeight,bitmapBits,&bitmapInfo,DIB_RGB_COLORS);
SelectObject(hMemDC,hOldBitmap);
//bitmapBits保存的就是屏幕的矩阵图像数据
//RGBQUADrgb[3];
//GetDIBColorTable(hMemDC,0,3,rgb);
//for(inti=0;ileft=61;
lpRect->top=776;
lpRect->right=165;
lpRect->bottom=780;
getrgb(lpRect);
system("pause");
return0;
}
|