GetDIBits获取不到位图实际数据
想用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);//显示桌面位图不正常