取出屏幕上某个像素的颜色值

 
为了取出屏幕上某点像素的颜色,常常使用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 取出的就是颜色值了。 
 

你可能感兴趣的:(算法,优化,工具)