創建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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章