getdibits用法
场景:GetDIBits用法解决方案
GetDIBits用法
int GetBitmapFromScreen(char *lpFileName)
{
char *lpBuf;
HBITMAP hBitmap,hOld ;
HDC hDC,hcDC;
BITMAP bb;BITMAPINFO b;
HANDLE hp,fh=NULL;
DWORD dwX,dwY;
//***************
//dwX=GetSystemMetrics(SM_CXSCREEN);
//dwY=GetSystemMetrics(SM_CYSCREEN);
dwX=800;
dwY=600;
hDC=GetDC(0);
hcDC=CreateCompatibleDC(hDC);
hBitmap=CreateCompatibleBitmap(hDC,dwX,dwY);
hOld=(HBITMAP)SelectObject(hcDC,hBitmap);
BitBlt(hcDC,0, 0,dwX,dwY, hDC, 0, 0, SRCCOPY);
bb.bmWidth=dwX;
bb.bmHeight =dwY;
bb.bmPlanes = 1;
bb.bmWidthBytes=bb.bmWidth*3;
bb.bmBitsPixel=3;
bb.bmType=0;
b.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
b.bmiHeader.biWidth=dwX;
b.bmiHeader.biHeight =dwY;
b.bmiHeader.biPlanes = 1;
b.bmiHeader.biBitCount =24;
b.bmiHeader.biCompression = BI_RGB;
b.bmiHeader.biSizeImage = 0;
b.bmiHeader.biXPelsPerMeter = 0;
b.bmiHeader.biYPelsPerMeter = 0;
b.bmiHeader.biClrUsed = 0;
b.bmiHeader.biClrImportant = 0;
b.bmiColors[0].rgbBlue=8;
b.bmiColors[0].rgbGreen=8;
b.bmiColors[0].rgbRed=8;
b.bmiColors[0].rgbReserved=0;
hp=GetProcessHeap();
lpBuf=(char *)HeapAlloc(hp,HEAP_ZERO_MEMORY,bb.bmHeight*bb.bmWidth*4);
GetDIBits(hcDC,hBitmap,0,dwY,lpBuf,&b,DIB_RGB_COLORS);
//SaveBitmapToFile(&bb,lpFileName,lpBuf);
ReleaseDC(NULL,hDC);
DeleteDC(hcDC);
DeleteObject(hBitmap);
DeleteObject(hOld);
HeapFree(hp,0,lpBuf);
return true;
}
请问各位牛人,用上面的办法,我得到一张图的数据,
那如果我要查该图(150,300)座标的颜色值,要怎么lpBuf查才可以?希望有详细的算法
------解决方案--------------------
oh,i have nothing
sorry..
------解决方案--------------------
参考:http://topic.****.net/t/20060707/23/4867626.html
------解决方案--------------------
如:256色 8位二进制数 即每个像素的占1个字节 依此类推
剩下的就是根据坐标来读取颜色的RGB值了
------解决方案--------------------
BYTE bBlue = lpBuf[bb.bmWidthBytes * 150 + 300 + 0];
BYTE bGreen = lpBuf[bb.bmWidthBytes * 150 + 300 + 1];
BYTE bRed = lpBuf[bb.bmWidthBytes * 150 + 300 + 2];
COLORREF color = RGB(bBlue, bGreen, bRed);
每个象素有三个字节,分别存放的GBR的值,位置的计算不一定对,由你的坐标系决定
------解决方案--------------------
分别存放的GBR的值
----------------------
纠正一下
分别存放的BGR的值
GetDIBits用法
int GetBitmapFromScreen(char *lpFileName)
{
char *lpBuf;
HBITMAP hBitmap,hOld ;
HDC hDC,hcDC;
BITMAP bb;BITMAPINFO b;
HANDLE hp,fh=NULL;
DWORD dwX,dwY;
//***************
//dwX=GetSystemMetrics(SM_CXSCREEN);
//dwY=GetSystemMetrics(SM_CYSCREEN);
dwX=800;
dwY=600;
hDC=GetDC(0);
hcDC=CreateCompatibleDC(hDC);
hBitmap=CreateCompatibleBitmap(hDC,dwX,dwY);
hOld=(HBITMAP)SelectObject(hcDC,hBitmap);
BitBlt(hcDC,0, 0,dwX,dwY, hDC, 0, 0, SRCCOPY);
bb.bmWidth=dwX;
bb.bmHeight =dwY;
bb.bmPlanes = 1;
bb.bmWidthBytes=bb.bmWidth*3;
bb.bmBitsPixel=3;
bb.bmType=0;
b.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
b.bmiHeader.biWidth=dwX;
b.bmiHeader.biHeight =dwY;
b.bmiHeader.biPlanes = 1;
b.bmiHeader.biBitCount =24;
b.bmiHeader.biCompression = BI_RGB;
b.bmiHeader.biSizeImage = 0;
b.bmiHeader.biXPelsPerMeter = 0;
b.bmiHeader.biYPelsPerMeter = 0;
b.bmiHeader.biClrUsed = 0;
b.bmiHeader.biClrImportant = 0;
b.bmiColors[0].rgbBlue=8;
b.bmiColors[0].rgbGreen=8;
b.bmiColors[0].rgbRed=8;
b.bmiColors[0].rgbReserved=0;
hp=GetProcessHeap();
lpBuf=(char *)HeapAlloc(hp,HEAP_ZERO_MEMORY,bb.bmHeight*bb.bmWidth*4);
GetDIBits(hcDC,hBitmap,0,dwY,lpBuf,&b,DIB_RGB_COLORS);
//SaveBitmapToFile(&bb,lpFileName,lpBuf);
ReleaseDC(NULL,hDC);
DeleteDC(hcDC);
DeleteObject(hBitmap);
DeleteObject(hOld);
HeapFree(hp,0,lpBuf);
return true;
}
请问各位牛人,用上面的办法,我得到一张图的数据,
那如果我要查该图(150,300)座标的颜色值,要怎么lpBuf查才可以?希望有详细的算法
------解决方案--------------------
oh,i have nothing
sorry..
------解决方案--------------------
参考:http://topic.****.net/t/20060707/23/4867626.html
------解决方案--------------------
如:256色 8位二进制数 即每个像素的占1个字节 依此类推
剩下的就是根据坐标来读取颜色的RGB值了
------解决方案--------------------
BYTE bBlue = lpBuf[bb.bmWidthBytes * 150 + 300 + 0];
BYTE bGreen = lpBuf[bb.bmWidthBytes * 150 + 300 + 1];
BYTE bRed = lpBuf[bb.bmWidthBytes * 150 + 300 + 2];
COLORREF color = RGB(bBlue, bGreen, bRed);
每个象素有三个字节,分别存放的GBR的值,位置的计算不一定对,由你的坐标系决定
------解决方案--------------------
分别存放的GBR的值
----------------------
纠正一下
分别存放的BGR的值