本文主要是介绍创建8位DIB并显示,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
做的一个项目由于系统是8位的,对于24位的DIB位图使用BitBlt函数的时候非常慢,在debug下测试对于2500*2500的图像,BitBlt函数用了大概4000-5000ms,非常的受不了,这里主要是由于系统是8位的,你创建的是24位的DIB,这时候用BitBlt函数的时候系统会做很多转换工作,所以速度就非常慢,解决办法就是直接创建8位的DIB来显示,和显示24位DIB最大的不同就是要把调色板信息加到位图文件头中:
LPBYTE lpBitmapInfo = NULL;
BITMAPINFOHEADER *lpBitmapHeader;
RGBQUAD *lpRgb;
int i;
lpBitmapInfo = (LPBYTE)new char[sizeof(BITMAPINFOHEADER) + 256 * sizeof(RGBQUAD) ];
if (lpBitmapInfo == NULL)
return;
lpBitmapHeader = (BITMAPINFOHEADER *)lpBitmapInfo;
lpBitmapHeader->biSize = sizeof (BITMAPINFOHEADER) ;
lpBitmapHeader->biWidth = wnd_w ;
lpBitmapHeader->biHeight = -wnd_h ;
lpBitmapHeader->biPlanes = 1 ;
lpBitmapHeader->biBitCount = 8 ;
lpBitmapHeader->biCompression = BI_RGB ;
lpBitmapHeader->biSizeImage = wnd_w * wnd_h;
lpBitmapHeader->biXPelsPerMeter = 0 ;
lpBitmapHeader->biYPelsPerMeter = 0 ;
lpBitmapHeader->biClrUsed = 0 ;
lpBitmapHeader->biClrImportant = 0 ;
关于调色板的地方不用自己再去设置系统调色板,要直接再创建位图的时候加上去
lpRgb = (RGBQUAD *)(lpBitmapInfo + sizeof(BITMAPINFOHEADER));
for (i = 0; i < 256; i++) {
lpRgb->rgbBlue = i;
lpRgb->rgbGreen = i;
lpRgb->rgbRed = i;
lpRgb->rgbReserved = 0;
lpRgb++;
}
hbitmap=CreateDIBSection(dc.GetSafeHdc(),
(CONST BITMAPINFO *)lpBitmapInfo,
DIB_RGB_COLORS,
//DIB_PAL_COLORS,
(void **)&rev_buff,
NULL,
0);
memcpy(rev_buff, g_pTempBuff, wnd_w*wnd_h);//g_pTempBuff中存放的是8位灰度值。
dc.BitBlt(0, 0, wnd_w, wnd_h, &dcCompatible, 0, 0, SRCCOPY);
OK,这样BitBlt的时间在DEBUG下不超过500ms了。
转自:http://blog.csdn.net/bigapple88/article/details/5746956
这篇关于创建8位DIB并显示的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!