最快的取点方法?

TBBT 2000-03-01 10:24:00
因为出差,小别了几天,现又有一问题需请教各位大虾:

因工作需要,需抓取PICTUREBOX或屏幕任一区域的点的颜色,我试了几种方法,如GETPIXEL,但仍太慢。是否有类似GETIMAGE的函数,可把一个区域的颜色直接符给
一个数组?


...全文
134 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
softdoctor 2000-03-02
  • 打赏
  • 举报
回复
zqy同志说的对极了!
zqy 2000-03-01
  • 打赏
  • 举报
回复
如果你是在MS Windows下,可以这样做:

//在24位真彩模式下
//把屏幕上的0,0,100,100的点信息抓下来
UINT cx=100,cy=100;//cx=width,cy=height
UINT x=0,y=0;//x=startX,y=startY

BITMAPINFO bitmapInfo;
unsigned char * pBuffer=new unsigned char[cx*cy*3];
memset(pBuffer,0,sizeof(char)*(cx*cy*3));
memset(&bitmapInfo,0,sizeof(BITMAPINFO));

HDC hScreenDC = ::GetDC(NULL);
HDC hMemDC = ::CreateCompatibleDC(hScreenDC);
HBITMAP hBitmap = ::CreateCompatibleBitmap(hScreenDC,cx,cy);
::SelectObject(hMemDC,hBitmap);
::BitBlt(hMemDC,0,0,cx,cy,hScreenDC,x,y,SRCCOPY);

bitmapInfo.bmiHeader.biWidth=cx;
bitmapInfo.bmiHeader.biHeight=cy;
bitmapInfo.bmiHeader.biBitCount=24;
bitmapInfo.bmiHeader.biPlanes=1;
bitmapInfo.bmiHeader.biSizeImage=cx*cy*3;
bitmapInfo.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);

::GetDIBits(hMemDC,hBitmap,0,cy,pBuffer,&bitmapInfo,DIB_RGB_COLORS);
//... you do here
delete []pBuffer;
::ReleaseDC(NULL,hScreenDC);
::DeleteDC(hMemDC);
::DeleteObject(hBitmap);
gauss 2000-03-01
  • 打赏
  • 举报
回复
可否创建一个MemDC,再得到Desktop或你要的窗口的WndDC,从WndDC BitBlt 到 MemDC,就可以通过访问MemDC联系着的Bitmap的内容(是一个数组来的)来知道你要的颜色了。
希望能帮得上你,
如果你用这个方法解决了问题,请告知我。
如果有另外的方法,也请你告诉我。

16,470

社区成员

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

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

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