vc 中动态显示bmp 的方法大致是三种:(我以320×240×1的255色灰度图举例)
(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)1:将bmp导入资源中,这是最方便的,但同时也是最不灵活的,而且也费资源。
使用CBitmap 的LoadBmp(..)
2:可以通过
hBitmap=(HBITMAP) ::LoadImage(NULL,picname,IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);
具体使用可以参考msdn,我一开始接触时 就是用的这个函数。
之后(CDC *pDc =GetDC();)
(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)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;i256;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); 小程序可能看不来,但是如果是采集卡上输出的数据,不用几十秒,你的内存就让它给吃完了。