截图问题

cutrain2009 2010-10-18 10:30:21
以下是部分代码
HWND hSource = ::GetDesktopWindow();
if (!hSource)
{
cout<<"没有找到窗口"<<endl;
return 0;
}
RECT SourceRect;
GetWindowRect(hSource,&SourceRect);

HDC hdcSource = ::GetDC(hSource);

HDC hdcMem = CreateCompatibleDC(hdcSource);
HBITMAP hSourceMap = ::CreateCompatibleBitmap(hdcMem,SourceRect.right- SourceRect.left,
SourceRect.bottom - SourceRect.top);
HBITMAP hOldBM = (HBITMAP)SelectObject(hdcMem,hSourceMap);
::BitBlt(hdcMem,0,0,SourceRect.right - SourceRect.left,SourceRect.bottom -SourceRect.top,
hdcSource,0,0,SRCCOPY);
hSourceMap = (HBITMAP)SelectObject(hdcMem,hOldBM);

这样在hSourceMap中就存有桌面的GDI位图
我获取BITMAP的信息
- m_bm {bmType=0 bmWidth=1280 bmHeight=800 ...} tagBITMAP
bmType 0 long
bmWidth 1280 long
bmHeight 800 long
bmWidthBytes 160 long
bmPlanes 1 unsigned short
bmBitsPixel 1 unsigned short
bmBits 0x00000000 void *
问题在于bmBitsPixel 怎么是 1. 我本来想和一个文件的Bmp图进行比较的,bmp的图加载后的位深是32;

这个GDI的位深1位,难道是黑白的,好郁闷,又卡住了,请大家帮帮忙
还有就是BMP文件我是通过LoadImage加载后得到一个HBITMAP句柄,这个是GDI位图,还是DIB
...全文
190 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
cutrain2009 2010-10-23
  • 打赏
  • 举报
回复
多谢大家啦,终于实现了,(*^__^*) 嘻嘻……
向立天 2010-10-22
  • 打赏
  • 举报
回复
与桌面兼容不意味着与桌面设置相同
我们创建的内存dc默认都是单色的
cutrain2009 2010-10-22
  • 打赏
  • 举报
回复
HDC hdcSource = GetDC(GetDesktopWindow());
HBITMAP hBitmap = CreateCompatibleBitmap(hdcSource,800,600);
GetObject(hBitmap,sizeof(bm),&bm);
这样创建的是32位深的图;

HDC hdcSource = GetDC(GetDesktopWindow());
HDC hdcMem = CreateCompatibleDC(hdcSource);
HBITMAP hBitmap = CreateCompatibleBitmap(hdcMem,800,600);
GetObject(hBitmap,sizeof(bm),&bm);
却是1为单色图;

所以问题就是DC的,这个间接创建的和原来的不一样
创建与桌面dc兼容的内存dc得到的是单色的?
向立天 2010-10-22
  • 打赏
  • 举报
回复
看MSDN
有说明
-----------------------------
备注:由CreateCompatibleBitmap函数创建的位图的颜色格式与由参数hdc标识的设备的颜色格式匹配。该位图可以选入任意一个与原设备兼容的内存设备环境中。由于内存设备环境允许彩色和单色两种位图。因此当指定的设备环境是内存设备环境时,由CreateCompatibleBitmap函数返回的位图格式不一定相同。然而为非内存设备环境创建的兼容位图通常拥有相同的颜色格式,并且使用与指定的设备环境一样的色彩调色板。
cutrain2009 2010-10-22
  • 打赏
  • 举报
回复
我直接用桌面的hdc做参数,可以创建出32位的bitmap,间接的使用就不行?
cutrain2009 2010-10-22
  • 打赏
  • 举报
回复
问题好像出在位图的创建上
HBITMAP hSourceMap = ::CreateCompatibleBitmap(hdcMem,SourceRect.right- SourceRect.left,
SourceRect.bottom - SourceRect.top);
我创建出来就是单色的,说以在截图的时候也只能得到单色的。查了资料,颜色格式是第一个参数影响的,我尝试了下,结果还是单色的。
cutrain2009 2010-10-21
  • 打赏
  • 举报
回复
请问有认识的人了解的吗,介绍下。
cutrain2009 2010-10-21
  • 打赏
  • 举报
回复
多谢啦,(*^__^*) 嘻嘻……
向立天 2010-10-21
  • 打赏
  • 举报
回复
论坛里的laviewpbt对这方面很有研究
你看看这个帖子
http://topic.csdn.net/u/20101014/21/cbde620a-842c-4be6-b2b4-7f4c85032efb.html?5323
Linux_木头 2010-10-21
  • 打赏
  • 举报
回复
我也不太懂 ,期待高手的解答。。。
向立天 2010-10-20
  • 打赏
  • 举报
回复
对这块不是很熟悉
所以不敢乱说
cutrain2009 2010-10-20
  • 打赏
  • 举报
回复
哎呀呀,怎么没人啊,这么冷清。
我想实现的是在屏幕中找图,首先要先把屏幕的位图数据转换成数据流形式。、、
然后从文件中加载一个图片,开始找图。 我已经实现了两个文件中找图了。
向立天 2010-10-19
  • 打赏
  • 举报
回复
你的截图有什么问题么
cutrain2009 2010-10-19
  • 打赏
  • 举报
回复
看来帖子要沉咯
cutrain2009 2010-10-19
  • 打赏
  • 举报
回复
就是在内存的存储情况我被搞蒙了,1280*800*1/8 字节数来存屏幕的图像。这怎么可能;
我觉的应该是1280*800*32/8 32位深才对啊;
cutrain2009 2010-10-18
  • 打赏
  • 举报
回复
通过GetBitmapBits获取截图的数据流,大小是1280*800*1/8 字节,这是怎么回事,
我本来是想通过比较两个图的数据流的
modyaj 2010-10-18
  • 打赏
  • 举报
回复
顶上去 别人来回答

19,468

社区成员

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

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