我已经得到了一个位图句柄hBmp,在下面的函数中有2个参数,我不知如何通过已知的hBmp来赋值
BOOL DrawDibDraw(
HDRAWDIB hdd,
HDC hdc,
int xDst,
int yDst,
int dxDst,
int dyDst,
LPBITMAPINFOHEADER lpbi, //如何通过已知的hBmp来赋值?
LPVOID lpBits, //如何通过已知的hBmp来赋值?
int xSrc,
int ySrc,
int dxSrc,
int dySrc,
UINT wFlags
);
BOOL DrawDibDraw(
HDRAWDIB hdd,
HDC hdc,
int xDst,
int yDst,
int dxDst,
int dyDst,
LPBITMAPINFOHEADER lpbi, //如何通过已知的hBmp来赋值?
LPVOID lpBits, //如何通过已知的hBmp来赋值?
int xSrc,
int ySrc,
int dxSrc,
int dySrc,
UINT wFlags
);
BITAMP bmp;
pBmp->GetBitmap(&bmp);
//自己根据bmp构造BITMAPHEADER
pBmp->GetBitmapBits
LPBITMAPINFOHEADER lpbi,
LPVOID lpBits
LPVOID lpBits
实际上就是一个缓冲区
pbminfo->biSize = sizeof BITMAPINFOHEADER;
pbminfo->biWidth =bmp.bmWidth;
pbminfo->biHeight = bmp.bmHeight;
pbminfo->biPlanes = bmp.bmPlanes;
pbminfo->biBitCount = bmp.bmBitsPixel ;
pbminfo->biCompression = BI_RGB;
pbminfo->biSizeImage = (3*pbminfo->biWidth+3)/4*4*abs(pbminfo->biHeight);
PBYTE pBuffer=(PBYTE)bmp.bmBits;
不过LPVOID lpBits=?
CBitmap* pBmp=CBitmap::FromHandle(hBitmap);
BITMAP bmp;
pBmp->GetBitmap(&bmp);
LPBITMAPINFOHEADER pbminfo = new BITMAPINFOHEADER;
ZeroMemory(pbminfo, sizeof (BITMAPINFOHEADER));
pbminfo->biSize = sizeof (BITMAPINFOHEADER);
pbminfo->biWidth =bmp.bmWidth;
pbminfo->biHeight = bmp.bmHeight;
pbminfo->biPlanes = bmp.bmPlanes;
pbminfo->biBitCount = bmp.bmBitsPixel ;
pbminfo->biCompression = BI_RGB;
pbminfo->biSizeImage = (3*pbminfo->biWidth+3)/4*4*abs(pbminfo->biHeight);
PBYTE pBuffer=(PBYTE)bmp.bmBits;if(m_hDrawDib)
{
DrawDibRealize(m_hDrawDib, pDC->GetSafeHdc(), TRUE );
DrawDibDraw( m_hDrawDib, pDC->GetSafeHdc(),
tragetRect.left, tragetRect.top, tragetRect.Width(), tragetRect.Height(),
pbminfo, (LPVOID)(pBuffer),
0, 0, 1024, 768,
DDF_BACKGROUNDPAL );
}可是运行后没有显示屏幕的截图啊:(
PBYTE pBuffer=(PBYTE)bmp.bmBits;//这里得到的bmp.bmBits为0x00000000,但其他的象bmp.bmWidth等都得到值了,为甚吗?源程序如上
如你上面的代码得到HBITMAP,BITMAPINFOHEADER以后,需要
COLORREF lpbuf = new COLORREF[bmp.bmWidth * bmp.bmHeight];
HDC hDC=GetDC(hWnd);
GetDIBits(hDC,hBitmap,0,bmp.bmHeight,lpbuf,pbminfo,DIB_RGB_COLORS);
ReleaseDC(hWnd,hDC);然后把lpbuf作为参数,DrawDibDraw最后一个参数换成DDF_HALFTONE试试看。
还有我的本意是想截取屏幕的图像,然后将其缩放到相应的窗口中显示,如果直接用GDI的StretchBlt太耗CPU了,所以就想用DrawDib,可是DrawDibDraw又要什么LPBITMAPINFOHEADER 作参数,所以我就把截取的屏幕转换成HBITMAP,不知道你有什么建议。
DrawDibDraw的图象缩放其速度及效果的确比StretchBlt好,但有个BUG,如果图象宽高比很大,既图象很长或很高,超过某一比例DrawDibDraw就显示不正常了,最好的方法是自己写缩放代码。当然你如果只用来截取屏幕图像是不会碰到这问题的。
了,如果是一个小的区域CPU使用率就很低,可是我需要截取并放大显示一块较大的屏幕区域,那有什么好办法呢?
我试过将截取的区域分割成很多小的区域,轮流对他们进行屏幕拷贝放大显示,可为了保证截屏画面的流畅,就要求对每个区域的拷贝次数要多,最好20帧/秒,但这样CPU的使用率又冲上去了(100%)请教各位有什么高见!