(源代码)获取RGB 值完全看不懂,求大神指点

木黑神 2016-04-09 09:05:43

char *lpBufbmp;
BITMAP bm;

void GetBmpData(LPCTSTR lpszName)
{
HANDLE hp;
HDC hdc,hdcmem;
HBITMAP hBm;
BITMAPINFO b;
hBm=(HBITMAP)LoadImage(NULL,/*"c:\\1.bmp"*/lpszName,IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION|LR_LOADFROMFILE);
GetObject(hBm,sizeof(BITMAP),(LPVOID)&bm);
hdc=::GetWindowDC(NULL);
hdcmem=CreateCompatibleDC(hdc);
SelectObject(hdcmem,hBm);
BitBlt(hdcmem,0,0,bm.bmWidth,bm.bmHeight,hdcmem,0,0,SRCCOPY);

b.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
b.bmiHeader.biWidth=bm.bmWidth;
b.bmiHeader.biHeight=bm.bmHeight;
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();
lpBufbmp=(char *)HeapAlloc(hp,HEAP_ZERO_MEMORY,bm.bmHeight*bm.bmWidth*4);
GetDIBits(hdc,hBm,0,bm.bmHeight,lpBufbmp,&b,DIB_RGB_COLORS);

DeleteObject(&hBm);
DeleteDC(hdc);
DeleteDC(hdcmem);
}

int GetBmpPixel(int x,int y)//获取位图颜色
{
if(x<0 || x>(int)dwX || x<0 || x>(int)dwY)return-1;
BYTE bBlue=lpBufbmp[bm.bmWidthBytes*(bm.bmHeight-y-1) + bm.bmBitsPixel*x/8 + 0];
BYTE bGreen=lpBufbmp[bm.bmWidthBytes*(bm.bmHeight-y-1) + bm.bmBitsPixel*x/8 + 1];
BYTE bRed=lpBufbmp[bm.bmWidthBytes*(bm.bmHeight-y-1) + bm.bmBitsPixel*x/8 + 2];

COLORREF color=RGB(bBlue,bGreen,bRed);
return int(color);
//return lpBufbmp[1];
}


下载的 C++高效屏幕找图 的源代码。
我只复制了一点代码(论坛里有下载)
这里的获取RGB 值完全看不懂,
求大神指点
...全文
262 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
木黑神 2016-04-14
  • 打赏
  • 举报
回复
引用 2 楼 zgl7903的回复:
BMP文件的数据存放是从下到上,从左到右的。也就是说,从文件中最先读到的是图像最下面的左边第一个像素,然后是左边第二个像素,接下来是倒数第二行左边第一个像素,左边第二个像素,依次类推 每个像素用3个字节表示(蓝\绿\红 )。每行用0填充到4字节的边界。
看完Win 程序设计5版中的 DIB ,DDB 还是不理解。 bm.bmBitsPixel*x/8  +0 +1 +2 这四个点不能理解, 现在只是把这句代码记住了,
木黑神 2016-04-14
  • 打赏
  • 举报
回复
引用 1 楼 笨笨仔的回复:
看来你需要先去了解一下RGB的原理,再看此段程序应该就明白了。(分段取值)
还是不理解,。。尤其是 bm.bmBitsPixel*x/8 + 0]这句
Eleven 2016-04-13
  • 打赏
  • 举报
回复
去看一下bmp位图相关的数据结构~
McuPlayer 2016-04-11
  • 打赏
  • 举报
回复
屏幕坐标是从上到下,BMP文件是从下到上, BmHight-1-i就是在做上下镜像
笨笨仔 2016-04-11
  • 打赏
  • 举报
回复
看来你需要先去了解一下RGB的原理,再看此段程序应该就明白了。(分段取值)
zgl7903 2016-04-11
  • 打赏
  • 举报
回复
BMP文件的数据存放是从下到上,从左到右的。也就是说,从文件中最先读到的是图像最下面的左边第一个像素,然后是左边第二个像素,接下来是倒数第二行左边第一个像素,左边第二个像素,依次类推 每个像素用3个字节表示(蓝\绿\红 )。每行用0填充到4字节的边界。

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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