关于GetDIBits,这个是为什么

sandrowjw 2004-08-24 10:18:45
如下代码,传入handle(实际上是资源的名称),获取位图数据,DC是桌面的DC。
思路是调用两次GetDIBits,第一次仅仅获取BITMAPINFO结构,第二次获取数据。
运行到_buf = new unsigned char [_res]的时候,_res = 256,我的位图是8 * 8,显示器是32bit真彩,这个数字好像是对的,但是接下来调用GetDIBits以后,_buf原来指向的那块内存区域内很准确地存放了位图的数据(我和texpad打开的比对过了,就多了alpha位),但是_buf自己却变成了0x000000ff,我晕倒了……
是我调用的方法不对吗?还是buf开的长度不对?求大虾解决:S

unsigned char* LoadBmpData(WORD handle)
{
//load the plan data
unsigned long _res = 0;
unsigned char* _buf = 0;
HBITMAP _hBmp = LoadBitmap(hInstance, MAKEINTRESOURCE(handle));
if(!_hBmp)
return 0;
//load bmp info
BITMAPINFO _bmpInfo;
ZeroMemory(&_bmpInfo, sizeof(BITMAPINFO));
_bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFO);
_res = GetDIBits(hDC, _hBmp, 0, 0, NULL, &_bmpInfo, DIB_RGB_COLORS);
if(!_res)
return 0;
//get data
_res = _bmpInfo.bmiHeader.biHeight * _bmpInfo.bmiHeader.biWidth * _bmpInfo.bmiHeader.biBitCount / 8;
_buf = new unsigned char[_res];
_res = GetDIBits(hDC, _hBmp, (UINT)0, (UINT)_bmpInfo.bmiHeader.biHeight, (LPVOID)_buf, &_bmpInfo, DIB_RGB_COLORS);
if(!_res)
{
delete [] (_buf);
_buf = 0;
}//if
DeleteObject(_hBmp);
return _buf;
}
...全文
420 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
sandrowjw 2004-08-27
  • 打赏
  • 举报
回复
搞定了,一开始的做法的确有问题,我估计和BMPINFO里的调色板数组有关系(应该是不需要调色板的,可能——但是不知道为什么——竟然填充了一个)。

后来的那种做法(另外建一个BMPINFO结构重新填充)我换了一台机器就OK了,不知道为什么,可能我的显卡驱动有问题,我的SDK是微软主页上下的不该有问题的。

谢谢各位的回复了,今天中午就放分。
sandrowjw 2004-08-26
  • 打赏
  • 举报
回复
GetDIBits()的返回值是8,是对的。
hDC我试过两种方法,一种是支持OPENGL窗口的,另一种就是简单的GetDC(NULL),都不行。
_buf开大一些我怀疑是有用的,不过我现在不敢在自己机器上试了,找台别人的机器试试:)
无聊客 2004-08-26
  • 打赏
  • 举报
回复
_res = _bmpInfo.bmiHeader.biHeight * ((_bmpInfo.bmiHeader.biWidth * _bmpInfo.bmiHeader.biBitCount + 31) / 32 * 4)
无聊客 2004-08-26
  • 打赏
  • 举报
回复
估计你的_buf开的不够大,_res是怎么算的?
Jimmy_Xia 2004-08-26
  • 打赏
  • 举报
回复
楼主,你试着_buf开的大一点呢?
lanstar200 2004-08-26
  • 打赏
  • 举报
回复
沒看到你的hDC是怎麽創建的
DentistryDoctor 2004-08-25
  • 打赏
  • 举报
回复
buf自己却变成了0x000000ff?
怎么会变呢?
eleek 2004-08-25
  • 打赏
  • 举报
回复
你检查一下GetDIBits()的返回值是否正确,如果不正确那用GetLastError()查看一下产生的错误是什么。
wrcluomo 2004-08-25
  • 打赏
  • 举报
回复
_res = _bmpInfo.bmiHeader.biHeight * _bmpInfo.bmiHeader.biWidth * _bmpInfo.bmiHeader.biBitCount / 8;
查这一句,是不是有错,是不是_res有问题致使NEW BUF失败. _buf = new unsigned char[_res];
sandrowjw 2004-08-25
  • 打赏
  • 举报
回复
呵,新进展:
我加了一些代码
_buf = new unsigned char[_res];
//再来一个结构,用于获取数据
BITMAPINFO _tmpInfo;
memset(&_tmpInfo, 0, sizeof(BITMAPINFO));
//只要填充前6个元素就够了是吧
_tmpInfo.bmiHeader.biWidth = _bmpInfo.bmiHeader.biWidth;
_tmpInfo.bmiHeader.biHeight = _bmpInfo.bmiHeader.biHeight;
_tmpInfo.bmiHeader.biPlanes = _bmpInfo.bmiHeader.biPlanes;
_tmpInfo.bmiHeader.biBitCount = _bmpInfo.bmiHeader.biBitCount;
_tmpInfo.bmiHeader.biCompression = _bmpInfo.bmiHeader.biCompression;
_tmpInfo.bmiHeader.biSize = sizeof(BITMAPINFO);
_res = GetDIBits(hDC, _hBmp, (UINT)0, (UINT)_bmpInfo.bmiHeader.biHeight, (LPVOID)_buf, &_bmpInfo, DIB_RGB_COLORS);

第一次运行,到GetDIBits以后马上蓝屏,重启,
再运行到这里,_buf和_buf指向的东东都OK了,再GO,蓝屏!!!
我都要哭了,是不是我的VC坏掉了?
sandrowjw 2004-08-25
  • 打赏
  • 举报
回复
自己顶一下,还有我的机器上不能用auxDIBImageLoad,报错是什么tk.obj的_ftol2是unresolved external,是不是会有关系?
sandrowjw 2004-08-25
  • 打赏
  • 举报
回复
我也不明白,而且我单独把这段代码拿出来执行也是一样有这个问题(单独执行的话,只要外面提供全局的hInstance和hDC,最后把传出来的buf释放掉就可以了,大家有兴趣的话可以试试)。
郁闷~~~~~~

19,468

社区成员

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

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