关于HBITMAP的问题!!!!

gy188166520 2009-11-30 05:07:01
HDC hScrDC,hMemDC;
HBITMAP hBitmap,hOldBitmap;
int nWidth=::GetSystemMetrics(SM_CXSCREEN);
int nHeight=::GetSystemMetrics(SM_CYSCREEN);
HDC MyDC=::GetDC(m_hWnd);
hScrDC=CreateDC(L"DISPLAY",NULL,NULL,NULL); //这个和下面那一句我试了下效果一样.不知道有什么区别
//hScrDC=::GetDC(NULL);
hMemDC=CreateCompatibleDC(hScrDC);
hBitmap=CreateCompatibleBitmap(hScrDC,nWidth,nHeight);
hOldBitmap=(HBITMAP)SelectObject(hMemDC,hBitmap);
BitBlt(hMemDC,0,0,nWidth,nHeight,hScrDC,0,0,SRCCOPY);
hBitmap=(HBITMAP)SelectObject(hMemDC,hOldBitmap);

这样貌似就得到了一个屏幕图象的HBITMAP
我不知道这样得到的HBITMAP和(HBITMAP)LoadImage(NULL,"pic1.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);这样得到的HBITMAP有什么不同...
还有.我试着输出hBitmap想看看它指向的地址结果发现这貌似并不是一个地址...小弟刚接触这个请大哥们讲解讲解
...全文
181 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
会飞的老鱼 2009-12-01
  • 打赏
  • 举报
回复
11楼说得不完全正确,当位图有调色板(256色及以下的位图都使用调色板)时,像素值只是位图像素的RGB颜色在调色板中真实颜色值的索引号。
会飞的老鱼 2009-12-01
  • 打赏
  • 举报
回复
同意4楼,你的hBitmap本来就不是指针,而是HBITMAP句柄,这种句柄的数量是系统事先就规定死了的,用户不能创建句柄,只能够从系统事先创建好的句柄中分配得到,我曾经看到过这样一个程序,它证明了这一点。
gy188166520 2009-11-30
  • 打赏
  • 举报
回复
GetBitmapBits的第2个参数到底是什么我看网上还有说是bm.bmHeight*bm.bmWidthBytes
Fengle123456 2009-11-30
  • 打赏
  • 举报
回复
wltg2001 2009-11-30
  • 打赏
  • 举报
回复
我这样做了一后buf里是什么??只有象素数据还是有其他的东西.
===========
应该是数据,具体的说就每一个点的RGB值
gy188166520 2009-11-30
  • 打赏
  • 举报
回复
晕....位图的位什么意思
mmilmf 2009-11-30
  • 打赏
  • 举报
回复
buf里是位图的位
gy188166520 2009-11-30
  • 打赏
  • 举报
回复
哦.知道了.刚才没注意看BITMAP这个结构
GetBitmapBits(hBitmap,bm.bmWidth*bm.bmHeight*bm.bmBitsPixel,buf);
这样就可以了..

我这样做了一后buf里是什么??只有象素数据还是有其他的东西.
gy188166520 2009-11-30
  • 打赏
  • 举报
回复
BITMAP bm;
GetObject(hBitmap,sizeof(bm),&bm);
GetBitmapBits(hBitmap,bm.bmWidth*bm.bmHeight*每位占的字节数,buf);
这个每位占的字节数怎么得到呢????还有我这样做了一后buf里是什么??只有象素数据还是有其他的东西.
bragi523 2009-11-30
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 gy188166520 的回复:]
谢谢大家..
最后问一下
如果我想用GetBitmapBits函数把那个HBITMAP读入到一个buf中该怎么写呢?
因为这个函数有个参数是这个位图的大小~~~

[/Quote]
那个位图的大小应该是 位图长*位图宽*每位占得字节数
gy188166520 2009-11-30
  • 打赏
  • 举报
回复
谢谢大家..
最后问一下
如果我想用GetBitmapBits函数把那个HBITMAP读入到一个buf中该怎么写呢?
因为这个函数有个参数是这个位图的大小~~~
davyaxl 2009-11-30
  • 打赏
  • 举报
回复
HBITMAP是个句柄,其实就是一个整型值。句柄跟指针是不一样的,句柄的值一般都不是数据块的地址。而是一个索引号,系统内部会有一个索引号到地址的映射表。真正的地址是由系统在那个表里查出来用的,你不能拿句柄当指针用。
bragi523 2009-11-30
  • 打赏
  • 举报
回复
[Quote=引用楼主 gy188166520 的回复:]

hScrDC=CreateDC(L"DISPLAY",NULL,NULL,NULL); //这个和下面那一句我试了下效果一样.不知道有什么区别
//hScrDC=::GetDC(NULL);
[/Quote]
上面是新建一个DC
后面是得到本窗口的DC



HBITMAP也是一样
你的是create的,LoadImage是具体以个位图的句柄
poy49295 2009-11-30
  • 打赏
  • 举报
回复
HDC GetDC(
HWND hWnd
);
Parameters
hWnd
Handle to the window whose device context is to be retrieved. If this value is NULL, GetDC retrieves the device context for the entire screen.



HDC CreateDC(
LPCTSTR lpszDriver,
LPCTSTR lpszDevice,
LPCTSTR lpszOutput,
CONST DEVMODE* lpInitData
);
Parameters
lpszDriver
[in] Long pointer to a null-terminated string that specifies the file name of a driver. If this parameter is set to NULL, the system returns a screen DC.


根据MSDN解释,我个人认为CreateDC的第一个参数设为NULL也可以返回screen DC。
MSDN上的例子是这样调用这个函数的hIC = CreateDC(TEXT("DISPLAY"),NULL,NULL,NULL);
这样就是专门用于获取显示设备的DC


这样得到的HBITMAP与LoadImage得到的HBITMAP是一样的,都是位图句柄,图像信息存放在内存中。
_JeffreyWu 2009-11-30
  • 打赏
  • 举报
回复
不一样啊,::GetDC(NULL); 获取的是屏幕DC啊

19,468

社区成员

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

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