GetDIBits获取不到位图实际数据

shuimx 2011-01-13 08:25:10
想用UDP传送位图。因此想知道位图的那些必要信息是要传送的。我就写了一个测试程序。
(1)自定义了一副位图,通过GetDIBits是可以得到位图的实际数据
void CDeskTopDlg::OnButton3()
{
// TODO: Add your control notification handler code here
CClientDC dc(this);

CBitmap bm;
bm.LoadBitmap(IDB_BITMAP1);
BITMAP bmpInfo;
bm.GetBitmap(&bmpInfo);
char *lpBits = NULL;
int biSizeImage = bmpInfo.bmWidthBytes * bmpInfo.bmHeight; //计算位图数据需要多少字节
lpBits =new char[biSizeImage];
bm.GetBitmapBits(biSizeImage, lpBits);//获取位图的实际数据

BITMAPINFO BitmapInfo;
BitmapInfo.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
BitmapInfo.bmiHeader.biWidth=bmpInfo.bmWidth;
BitmapInfo.bmiHeader.biHeight=bmpInfo.bmHeight;
BitmapInfo.bmiHeader.biPlanes=1;
BitmapInfo.bmiHeader.biBitCount=32;//这里是位图的颜色位数,如果你的位图不是真彩色的,也就是小于等于8位,那就麻烦了,你还要编程实现BitmapInfo.bmiColors结构,所以建议将位图设计成真彩色的,不要吝惜那点空间!
BitmapInfo.bmiHeader.biCompression=BI_RGB;
BitmapInfo.bmiHeader.biClrUsed=0;
BitmapInfo.bmiHeader.biSizeImage=0;
BitmapInfo.bmiHeader.biXPelsPerMeter=0;
BitmapInfo.bmiHeader.biYPelsPerMeter=0;
BitmapInfo.bmiHeader.biClrImportant=0;

CRect rc;
GetDlgItem(IDC_DT)->GetWindowRect(&rc);
ScreenToClient(&rc);
StretchDIBits(dc.m_hDC,rc.left,rc.top+rc.Height(),rc.Width(),-rc.Height(),
0,0,bmpInfo.bmWidth,bmpInfo.bmHeight,lpBits,&BitmapInfo,DIB_RGB_COLORS,SRCCOPY);

delete [] lpBits;
}
(2)但是当我用获取桌面的位图时就不能正确显示位图了,而是全黑色。为了做对比,放置了两个picture控件,一个可以正常显示 StretchBlt,另一个全是黑色GetDIBits。我调试查看信息发现执行GetDIBits语句后,pData指向的内容全是0。。。
CClientDC dc(this);

CDC* pDeskDC = GetDesktopWindow()->GetDC(); //获取桌面画布对象
int width = 1440; //获取屏幕的宽度
int height = 900;

CDC memDC; //定义一个内存画布
memDC.CreateCompatibleDC(&dc);//创建一个兼容的画
CBitmap bmp;
// bmp.LoadBitmap(IDB_BITMAP1);
bmp.CreateCompatibleBitmap(pDeskDC,width,height); //创建兼容位图
memDC.SelectObject(&bmp); //选中位图对象

BITMAP bitmap;
bmp.GetBitmap(&bitmap);
CRect rc;
GetDlgItem(IDC_DT)->GetWindowRect(&rc);
ScreenToClient(&rc);
dc.StretchBlt(rc.left,rc.top,rc.Width(),rc.Height(),pDeskDC,0,0,bitmap.bmWidth,bitmap.bmHeight,SRCCOPY);//显示桌面位图正常
//////////////////////////////////////////////////////////
//定义位图信息
BITMAPINFO BInfo;
BInfo.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
BInfo.bmiHeader.biWidth=bitmap.bmWidth;
BInfo.bmiHeader.biHeight=bitmap.bmHeight;
BInfo.bmiHeader.biPlanes=1;
BInfo.bmiHeader.biBitCount=32;//这里是位图的颜色位数,如果你的位图不是真彩色的,也就是小于等于8位,那就麻烦了,你还要编程实现BitmapInfo.bmiColors结构,所以建议将位图设计成真彩色的,不要吝惜那点空间!
BInfo.bmiHeader.biCompression=BI_RGB;
BInfo.bmiHeader.biClrUsed=0;
BInfo.bmiHeader.biSizeImage=0;
BInfo.bmiHeader.biXPelsPerMeter=0;
BInfo.bmiHeader.biYPelsPerMeter=0;
BInfo.bmiHeader.biClrImportant=0;
//定义一个位图数据指针
char* pData = new char[bitmap.bmWidthBytes*bitmap.bmHeight];
::GetDIBits(memDC.m_hDC,bmp,0,bitmap.bmHeight,pData,&BInfo,DIB_RGB_COLORS);

CRect rc2;
GetDlgItem(IDC_DT2)->GetWindowRect(&rc2);
ScreenToClient(&rc2);

int ret = StretchDIBits(dc.m_hDC,rc2.left,rc2.top+rc2.Height(),rc2.Width(),-rc2.Height(),
0,0,bitmap.bmWidth,bitmap.bmHeight,pData,&BInfo,DIB_RGB_COLORS,SRCCOPY);//显示桌面位图不正常
...全文
357 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
shuimx 2011-01-13
  • 打赏
  • 举报
回复
我这样加的
CDC memDC; //定义一个内存画布
memDC.CreateCompatibleDC(&dc);//创建一个兼容的画
CBitmap bmp;
// bmp.LoadBitmap(IDB_BITMAP1);
bmp.CreateCompatibleBitmap(pDeskDC,width,height); //创建兼容位图
memDC.SelectObject(&bmp); //选中位图对象

memDC.BitBlt(0,0,width,height, pDeskDC,width,height,SRCCOPY);还是不行。。。。。
lizhigang34 2011-01-13
  • 打赏
  • 举报
回复
你说显示桌面时全是黑色,我想问题可能在这里:
CDC memDC; //定义一个内存画布
memDC.CreateCompatibleDC(&dc);//创建一个兼容的画
CBitmap bmp;
// bmp.LoadBitmap(IDB_BITMAP1);
bmp.CreateCompatibleBitmap(pDeskDC,width,height); //创建兼容位图
memDC.SelectObject(&bmp); //选中位图对象
//应该再用BitBlt把桌面上的内容复制到memDC
memDC.BitBlt(..., pDeskDC,..);
shuimx 2011-01-13
  • 打赏
  • 举报
回复
我创建一幅图像,可以取出数据。程序写在上面了。
TandyT 2011-01-13
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 lizhigang34 的回复:]
你说显示桌面时全是黑色,我想问题可能在这里:
CDC memDC; //定义一个内存画布
memDC.CreateCompatibleDC(&dc);//创建一个兼容的画
CBitmap bmp;
// bmp.LoadBitmap(IDB_BITMAP1);
bmp.CreateCompatibleBitmap(pDeskDC,width,height); //创建兼容位图
……
[/Quote]


这样还不行的话,你是没成功获取到图像的数据吧,怎么会全是 0 的呢?你自己创建一幅图像试试,可能是你获取桌面图像时出错了

19,468

社区成员

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

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