为了取出屏幕上某点像素的颜色,常常使用GDI函数GetPixel, 其原形如下:
COLORREF GetPixel(
HDC
hdc
,
// handle to DC
int
nXPos
,
// x-coordinate of pixel
int
nYPos
// y-coordinate of pixel
);
GetPixel
的效率并不高,如果频繁地使用将会造成软件的反应速度。例如,画板工具一般是单线程的架构,如果程序在做刚画的线条反锯齿优化处理的时候,用户是无法继续画线条的,所以要求反锯齿的算法代码执行速度非常高。而反锯齿的算法中需要取像素的颜色的。
如果不用GetPixel函数,能不能用另外的方法来取得某个像素的颜色值?
可以的。思路如下:
取得画布中的位图信息,计算像素在位图中对应的位置,即可取得颜色值。
如下功能只考虑32位图的情况:
HBITMAP GetSrcBit(HDC hDC, DWORD BitWidth, DWORD BitHeight)
{
HDC hBufDC;
HBITMAP hBitmap, hBitTemp;
//
创建设备上下文(HDC)
hBufDC = CreateCompatibleDC(hDC);
//
创建HBITMAP
hBitmap = CreateCompatibleBitmap(hDC, BitWidth, BitHeight);
hBitTemp = (HBITMAP) SelectObject(hBufDC, hBitmap);
//
得到位图缓冲区
StretchBlt(hBufDC, 0, 0, BitWidth, BitHeight,
hDC, 0, 0, BitWidth, BitHeight, SRCCOPY);
//
得到最终的位图信息
hBitmap = (HBITMAP) SelectObject(hBufDC, hBitTemp);
//
释放内存
DeleteObject(hBitTemp);
::DeleteDC(hBufDC);
return hBitmap;
}
////////////////
BITMAP Bitmap; //
画布的bmp的信息
HBITMAP hBmpDC = GetSrcBit(hdc, dcRect.right, dcRect.bottom + 50); //
高度要比实际大一点,以免越界
GetObject(hBmpDC, sizeof(Bitmap), (LPSTR)&Bitmap);
VOID* lpBmpVoid = GlobalAlloc(GHND, Bitmap.bmHeight*Bitmap.bmWidthBytes);
LPSTR lpBmpstr = (LPSTR)GlobalLock(lpBmpVoid);
GetBitmapBits(hBmpDC, Bitmap.bmWidthBytes * Bitmap.bmHeight, lpBmpstr);
……………
…………
..
offset = (Bitmap.bmWidthBytes)*
nYPos
+
nXPos
*(Bitmap.bmBitsPixel/8);
bgColor = (*(DWORD *)(lpBmpstr + offset));
bgColor = (bgColor & 0xFF00FF00) | ((bgColor >> 16) & 0x000000FF) | ((bgColor << 16) & 0x00FF0000);
……………
…………
..
GlobalUnlock(lpBmpVoid);
GlobalFree(lpBmpVoid);
DeleteObject(hBmpDC);
////////////////
bgColor
取出的就是颜色值了。