GetDIBits用法

bluetx 2007-06-09 06:00:58
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);



ReleaseDC(NULL,hDC);
DeleteDC(hcDC);
DeleteObject(hBitmap);
DeleteObject(hOld);
HeapFree(hp,0,lpBuf);
return true;
}

请问各位牛人,用上面的办法,我得到一张图的数据,
那如果我要查该图(150,300)座标的颜色值,要怎么lpBuf查才可以?希望有详细的算法

...全文
2209 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
gxustudent 2008-09-02
  • 打赏
  • 举报
回复
tracing 的答案还有些抽象,看我的:
for(y=0;y<bi.bmiHeader.biHeight;y++)
{
for(x=0;x<bi.bmiHeader.biWidth;x++)
{
BYTE bBlue = pbyteBuff[bi.bmiHeader.biWidth*y*4+4*x+0];
BYTE bGreen = pbyteBuff[bi.bmiHeader.biWidth*y*4+4*x+1];
BYTE bRed = pbyteBuff[bi.bmiHeader.biWidth*y*4+4*x+2];
PixelArray[bi.bmiHeader.biHeight-y][x]=RGB(bBlue, bGreen, bRed);


}
siteee 2007-11-20
  • 打赏
  • 举报
回复
继续学习
rulera 2007-06-13
  • 打赏
  • 举报
回复
学习`
nf3 2007-06-13
  • 打赏
  • 举报
回复
够清楚的了
tracing 2007-06-12
  • 打赏
  • 举报
回复
晕,这个问题你问过了,我还发消息给你的,上次我写错了,这次重写下,只不过数组而已
第一个点从(0,0)开始,到(150,300),共301行,151列,根据的你程序,每个象素3个字节,每行的字节数为bb.bmWidthBytes,bb.bmWidthBytes * y就是前300行的字节数,bb.bmBitsPixel * x 就是第301行前150个象素所占的字节数,
bb.bmWidthBytes * y + bb.bmBitsPixel * x 就是(150,300)这个象素的地址,分别去第1,2,3个字节就是BRG的值
y = 300,x = 150
BYTE bBlue = lpBuf[bb.bmWidthBytes * y + bb.bmBitsPixel * x + 0];
BYTE bGreen = lpBuf[bb.bmWidthBytes * y + bb.bmBitsPixel * x + 1];
BYTE bRed = lpBuf[bb.bmWidthBytes * y + bb.bmBitsPixel * x + 2];
COLORREF color = RGB(bBlue, bGreen, bRed);
我想我已经说得很清楚了
bluetx 2007-06-09
  • 打赏
  • 举报
回复
各位大哥 来段代码示范吧,不然还是不解啊,体谅小弟笨笨的
  • 打赏
  • 举报
回复
二维矩阵
bluetx 2007-06-09
  • 打赏
  • 举报
回复
http://72.14.235.104/search?q=cache:Uc8qaDGF9zQJ:topic.csdn.net/t/20041027/23/3497689.html+GetDIBits+%E9%A1%8F%E8%89%B2&hl=zh-TW&ct=clnk&cd=7&gl=tw&lr=lang_zh-CN|lang_zh-TW

VB的哪位大侠可以解释成VC的?
bluetx 2007-06-09
  • 打赏
  • 举报
回复
看不出这些方法有哪些可以解决我的问题阿?'
我需要的是一个公式,不如举个例子给我看好吗?谢谢
CathySun118 2007-06-09
  • 打赏
  • 举报
回复
参考:http://topic.csdn.net/t/20060707/23/4867626.html
bluetx 2007-06-09
  • 打赏
  • 举报
回复
可否来个详细代码?
例如我想找(150,300)的颜色
lailuboy 2007-06-09
  • 打赏
  • 举报
回复
很容易啊,那一点的颜色可以由知道点的坐标、图像数据的起始位置图像的宽度计算得到在内存中的位置,是相对于图像数据的起始位置+Y坐标×图像的宽度+X坐标
bluetx 2007-06-09
  • 打赏
  • 举报
回复
这位大哥我要的不是这种方法,
我是要利用GetDIBits(hcDC,hBitmap,0,dwY,lpBuf,&b,DIB_RGB_COLORS);
裡头的lpBuf找出某一点座标的颜色,
如果有更好的办法,也可以提出
Y___Y 2007-06-09
  • 打赏
  • 举报
回复
HDC hdc;
HDC mdc;
BITMAP bm;
HBITMAP hBmp;
unsigned char *px; // 指向存储像素的地址
hdc = GetDC(hWnd);
mdc = CreateCompatibleDC(hdc);
hBmp = LoadImage(NULL, "test.bmp", IMAGE_BITMAP, 40, 40, LR_LOADFROMFILE);
GetObject(hBmp, sizeof(BITMAP), &bm);
px = new unsigned char[bm.bmHeight * bmWidthBytes];
GetBitmapBits(hBmp, bm.bmHeight * bm.WidthBytes, px);

19,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧