vc 中動態顯示bmp 的方法大致是三種:(我以320×240×1的255色灰度圖舉例)
1:將bmp導入資源中,這是最方便的,但同時也是最不靈活的,而且也費資源。
使用CBitmap 的LoadBmp(..)
2:可以通過
hBitmap=(HBITMAP) ::LoadImage(NULL,picname,IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);
具體使用可以參考msdn,我一開始接觸時 就是用的這個函數。
之後(CDC *pDc =GetDC();)
HBITMAP OldBitmap;
CDC MemDC;
CRect rect;
MemDC.CreateCompatibleDC(pDc);
GetClIEntRect(rect);
OldBitmap=(HBITMAP)MemDC.SelectObject(hBitmap);
pDc->BitBlt(4,4,(rect.Width())-3,(rect.Height())-3,&MemDC,0,0,SRCCOPY);
MemDC.SelectObject(OldBitmap);
MemDC.DeleteDC();
DeleteObject((HGDIOBJ)hBitmap);
就可以在自己喜歡的地方顯示bmp圖了。如果顯示的是灰度圖,這樣可以不考慮彩色表,本身是什麼圖(灰度的,彩色的,單色的)它就顯示什麼圖。
3:通過數據數組:從采集卡上采集的都是固定格式的數據。所以沒有必要將數據做成bmp圖,在通過(2)的方法顯示出來---我最初就是用這種方法,很笨的哦。
通過函數:StretchDIBits(*pDc,10,10,640,480,0,0,320,240,tmp_buf,bmpInfoHdr,BI_RGB,SRCCOPY);-(640,480,是將原圖擴大到這個象素)。其中tmp_buf 為數據數組的地址,bmpInfoHdr為位圖信息。
LPBITMAPINFO bmpInfoHdr= (LPBITMAPINFO)new BYTE[1064];
fread(&bmpFileHdr,sizeof(BITMAPFILEHEADER),1, fp);
fread(&bmpInfoHdr->bmiHeader,40,1, fp);
for(int i=0;i<256;i++)
{
bmpInfoHdr->bmiColors[i].rgbBlue=(BYTE)i;
bmpInfoHdr->bmiColors[i].rgbGreen=(BYTE)i;
bmpInfoHdr->bmiColors[i].rgbRed=(BYTE)i;
bmpInfoHdr->bmiColors[i].rgbReserved=(BYTE)0;
}
由於是灰度圖,所以需要自定義彩色表。
*CBitmap 中的 m_bmp.CreateBitmap(320,240,1,255,(BYTE*)tmp_buf);或CreateBitmap(320,240,1,255,(BYTE*)tmp_buf);
都不好用, 原因是 msdn中說的,第三個參數和第四個參數都應為1,才能輸出圖,並且只能是單色圖,還有 m_bmp.CreateBitmapIndirect(&bitmap)。。。CreateCompatibleBitmap等等,這麼麻煩,還不一定好用,我還不如不用這個方法了。
最後別忘了要刪除bmp圖占的空間。如
MemDC.DeleteDC(); DeleteObject((HGDIOBJ)hBitmap); 小程序可能看不來,但是如果是采集卡上輸出的數據,不用幾十秒,你的內存就讓它給吃完了。