抓屏 和 像素点 操作 的问题
1、我在做一个抓屏软件,但是要对其中的大部分像素点进行操作。
2、我如果直接在屏幕DC上操作,速度很慢,所以是通过BitBlt将屏幕DC的东西Copy出来,然后GetPixel取得像素点操作,处理完成后用SetPixel写入DC。
3、问题是,直接操作屏幕DC可以,但Copy出来,GetPixel就得不到像素值,请高手帮忙分析下。
4、下面代码是我简化后的代码。
HDC hScrDC, hMemDC;
// 屏幕和内存设备描述表
HBITMAP hBitmap, hOldBitmap;
// 位图句柄
int nX=0, nY=0, nX2=300, nY2=300;
// 选定区域坐标
int nWidth = 300, nHeight=300;
//为屏幕创建设备描述表
hScrDC = CreateDC("DISPLAY", NULL, NULL, NULL);
//为屏幕设备描述表创建兼容的内存设备描述表
hMemDC = CreateCompatibleDC(hScrDC);
// 创建一个与屏幕设备描述表兼容的位图
hBitmap = CreateCompatibleBitmap(hScrDC, nWidth, nHeight);
// 把新位图选到内存设备描述表中
hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap);
// 把屏幕设备描述表拷贝到内存设备描述表中
BitBlt(hMemDC, 0, 0, nWidth, nHeight, hScrDC, nX, nY, SRCCOPY); //我希望是,将屏幕信息Copy到hMemDC里面,然后我在对像素进行操作
//得到屏幕位图的句柄
hBitmap = (HBITMAP)SelectObject(hMemDC, hOldBitmap);
//临时DC,为了存储临时位图
HDC hDlgDc = GetDC()->m_hDC;
//比较位图
for( int i=0; i<200; i++)
for( int j=0; j<200; j++)
{
unsigned long lLeftPoint = GetPixel( hMemDC , i , j ); //这里得到的像素值不对
//unsigned long lRighPoint = GetPixel( hScrDC , i , j ); //如果用这个,可以显示,但整个操作就会太慢
SetPixel( hDlgDc , i , j , lLeftPoint );// lRighPoint
}
//将位图显示到对话框
BitBlt( GetDC()->m_hDC , 0 , 0 , 200 , 200 , hDlgDc , 0, 0, SRCCOPY);
//清除
DeleteDC(hScrDC);
DeleteDC(hMemDC);