龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > VC开发 >

vc中显示bmp常用的几个函数介绍

时间:2009-12-30 15:42来源:未知 作者:admin 点击:
分享到:
vc 中动态显示bmp 的方法大致是三种:(我以320×240×1的255色灰度图举例) 1:将bmp导入资源中,这是最方便的,但同时也是最不灵活的,而且也费资源。 使用CBitmap 的LoadBmp(..) 2:可以

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); 小程序可能看不来,但是如果是采集卡上输出的数据,不用几十秒,你的内存就让它给吃完了。

收藏文章
表情删除后不可恢复,是否删除
取消
确定
图片正在上传,请稍后...
评论内容为空!
还没有评论,快来抢沙发吧!
按钮 内容不能为空!
立刻说两句吧! 查看0条评论
精彩图集

赞助商链接