程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> vc教程 >> vc中顯示bmp常用的幾個函數介紹

vc中顯示bmp常用的幾個函數介紹

編輯:vc教程

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); 小程序可能看不來,但是如果是采集卡上輸出的數據,不用幾十秒,你的內存就讓它給吃完了。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved