如何得到并输出屏幕某一矩形区域所有点的RGB值

lonky6545646 2012-10-29 09:56:00
#include<Windows.h>
#include<iostream>
using namespace std;
//使用多字节字符集:项目>最后一项>配置属性>常规 里设置
void getrgb(LPRECT lpRect)
{
HDC hScrDC,hMemDC; //声明屏幕和内在设备描述表

HBITMAP hBitmap,hOldBitmap; //新老位图句柄

int nX,nY,nX2,nY2; //选定区域坐标

int nWidth,nHeight; //位图宽度和高度

int xScrn,yScrn; //屏幕分辨率

//if(IsRectEmpty(lpRect)) //确保选定区域不为空矩形
// return NULL;

hScrDC=CreateDC("DISPLAY",NULL,NULL,NULL); //为屏幕创建设备描述表

hMemDC=CreateCompatibleDC(hScrDC);
//为屏幕设备描述表创建兼容的内存设备描述表

nX=lpRect->left; //获得选定区域坐标
nY=lpRect->top;
nX2=lpRect->right;
nY2=lpRect->bottom;

xScrn=GetDeviceCaps(hScrDC,HORZRES); //获得屏幕分辨率
yScrn=GetDeviceCaps(hScrDC,VERTRES);

if(nX<0) nX=0; //确保选定区域是可见的
if(nY<0) nY=0;
if(nX2>xScrn) nX2=xScrn;
if(nY2>yScrn) nY2=yScrn;

nWidth=nX2-nX; //获得位图的宽度和高度
nHeight=nY2-nY;

hBitmap=CreateCompatibleBitmap(hScrDC,nWidth,nHeight);
//创建一个与屏幕设备描述表兼容的位图

hOldBitmap=(HBITMAP)SelectObject(hMemDC,hBitmap);
// 把新位图选到内存设备描述表中

BitBlt(hMemDC,0,0,nWidth,nHeight,hScrDC,nX,nY,SRCCOPY);
// 把屏幕设备描述表拷贝到内存设备描述表中

hBitmap = (HBITMAP)SelectObject(hMemDC, hOldBitmap);
//得到屏幕位图的句柄


RGBQUAD rgb[3];

GetDIBColorTable(hMemDC,0,3,rgb);

for(int i=0;i<3;i++)
{
cout<<rgb[i].rgbRed<<","<<rgb[i].rgbGreen<<","<<rgb[i].rgbBlue<<endl;
}

DeleteDC(hScrDC); //清除

DeleteDC(hMemDC);
}

int main()
{
LPRECT lpRect=new RECT() ; //注意实体类型变量初始化
lpRect->left=301;
lpRect->top=217;
lpRect->right=12*20+301;
lpRect->bottom=2*16+217;

getrgb(lpRect);

system("pause");
return 0;
}

如何得到并输出屏幕某一矩形区域所有点的RGB值 ?
上面的代码哪里出错了?
可令去掉某些代码么?
谢谢
...全文
290 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
lonky6545646 2012-10-29
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
C/C++ code

void getrgb(LPRECT lpRect)
{
for (int x=lpRect->left; x<lpRect->right; x++)
{
for (int y=lpRect->top; y<lpRect->bottom; y++)
{
COLORREF color = ……
[/Quote]


这里的GetPixel函数用于偶尔处理一个点还行 处理几百个点 速度太慢了
「已注销」 2012-10-29
  • 打赏
  • 举报
回复
void getrgb(LPRECT lpRect)
{
for (int x=lpRect->left; x<lpRect->right; x++)
{
for (int y=lpRect->top; y<lpRect->bottom; y++)
{
COLORREF color = GetPixel(GetDC(NULL), x, y);
printf("%X, %X, %X\n", GetRValue(color),
GetGValue(color),
GetBValue(color));
}
}
}
lonky6545646 2012-10-29
  • 打赏
  • 举报
回复
求指教
lonky6545646 2012-10-29
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]
要想效率高,直接用BitBlt函数将屏幕图形某一矩形区域内容绘制到内存位图中,
然后参考内存位图的结构读取对应点的RGB值。
[/Quote]

谢谢你了 上半年就开始关注你了
赵4老师 2012-10-29
  • 打赏
  • 举报
回复
要想效率高,直接用BitBlt函数将屏幕图形某一矩形区域内容绘制到内存位图中,
然后参考内存位图的结构读取对应点的RGB值。
赵4老师 2012-10-29
  • 打赏
  • 举报
回复
#define MAXY 1280
#define MAXX 1024
static BYTE R[MAXY][MAXX],G[MAXY][MAXX],B[MAXY][MAXX];
void getrgb(LPRECT lpRect)
{
for (int x=lpRect->left; x<lpRect->right; x++)
{
for (int y=lpRect->top; y<lpRect->bottom; y++)
{
COLORREF color = GetPixel(GetDC(NULL), x, y);
int Y=y-lpRect->top;
int X=x-lpRect->left;
R[Y][X]=GetRValue(color);
G[Y][X]=GetGValue(color);
B[Y][X]=GetBValue(color);
}
}
}
lonky6545646 2012-10-29
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
GetPixel不慢,显示慢或保存GetPixel的结果到文件慢。
[/Quote]
你好!请教下您:利用GetDIBColorTable函数如何得到屏幕某一指定区域所有象素点的RGB值,有点像截图那样,我是想将指定区域内的点的RGB值放到数组中,然后直接用数组判断符合要求的点.方便的话能举个简单的例子.谢谢
赵4老师 2012-10-29
  • 打赏
  • 举报
回复
GetPixel不慢,显示慢或保存GetPixel的结果到文件慢。

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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