vc中动态显示bmp

 

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= (  )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.
  
3.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值