获取屏幕信息后如何读取其像素信息

stevezok 2010-04-28 03:33:46
先说说目的,我需要获取屏幕中的某个指定区域,并将其转化为像素信息通过USB接口传递给专用设备,传递方式为:以两个字节为一个像素,循环发送。

目前能通过如下代码获取到位图句柄:

HBITMAP CscreentestDlg::CopyScreenToBitmap(LPRECT 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);

//清除
DeleteDC(hScrDC);
DeleteDC(hMemDC);

// 返回位图句柄
return hBitmap;
}

请问下一步应该如何获取其中的具体像素信息,或者如果有其他思路应该怎么处理?
...全文
366 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
向立天 2010-04-29
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 stevezok 的回复:]
引用 5 楼 xianglitian 的回复:
你是要传裸数据还是要传图片信息?
裸数据的话仔细看一楼的函数就可以满足你获取数据的要求了
要是带文件信息你还要自己填一个bmp的文件头


传图片信息,图片信息直接从内存里面读取,然后按三个字节一个像素的格式发送。就是怎么获取像素的问题。
[/Quote]

一楼的函数
LPVOID lpvBits, // array for bitmap bits
这个参数就是数据
stevezok 2010-04-28
  • 打赏
  • 举报
回复
因为之前不是做这行的,甚至于之前用的开发工具也不是VC,现在临时被抽调来搞这个,很多基础知识不足,需要有一定的代码才好理解。
stevezok 2010-04-28
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 xianglitian 的回复:]
你是要传裸数据还是要传图片信息?
裸数据的话仔细看一楼的函数就可以满足你获取数据的要求了
要是带文件信息你还要自己填一个bmp的文件头
[/Quote]

传图片信息,图片信息直接从内存里面读取,然后按三个字节一个像素的格式发送。就是怎么获取像素的问题。
向立天 2010-04-28
  • 打赏
  • 举报
回复
你是要传裸数据还是要传图片信息?
裸数据的话仔细看一楼的函数就可以满足你获取数据的要求了
要是带文件信息你还要自己填一个bmp的文件头
stevezok 2010-04-28
  • 打赏
  • 举报
回复
接触这方面的东西不久,请问能不能给出一段式例代码参考。
m_tornado 2010-04-28
  • 打赏
  • 举报
回复
GetPixel()忒慢,GetBits()直接访问数据,速度不可同日而语~
尹成 2010-04-28
  • 打赏
  • 举报
回复
用GetPixel(x,y)一个个点来读取数据
cdsnpeter 2010-04-28
  • 打赏
  • 举报
回复
int GetDIBits(
HDC hdc, // handle to DC
HBITMAP hbmp, // handle to bitmap
UINT uStartScan, // first scan line to set
UINT cScanLines, // number of scan lines to copy
LPVOID lpvBits, // array for bitmap bits
LPBITMAPINFO lpbi, // bitmap data buffer
UINT uUsage // RGB or palette index
);

使用这个API。

19,468

社区成员

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

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