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

2016-02-19 21:06 21 1 收藏

下面图老师小编要向大家介绍下vc中显示bmp常用的几个函数介绍,看起来复杂实则是简单的,掌握好技巧就OK,喜欢就赶紧收藏起来吧!

【 tulaoshi.com - 编程语言 】

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);

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

就可以在自己喜欢的地方显示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图占的空间。如

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

MemDC.DeleteDC();   DeleteObject((HGDIOBJ)hBitmap); 小程序可能看不来,但是如果是采集卡上输出的数据,不用几十秒,你的内存就让它给吃完了。

来源:http://www.tulaoshi.com/n/20160219/1625275.html

延伸阅读
常用类 CRect: 用来表示矩形的类,拥有四个成员变量:top left bottom right。分别表是左上角和右下角的坐标。可以通过以下的方法构造: CRect( int l , int t , int r , int b ); 指明四个坐标 CRect( const RECT& srcRect ); 由RECT结构构造 CRect( LPCRECT lpSrcRect ); 由RECT结构构造 CRect( POINT point , SIZE ...
标签: PHP
  把GB码转换到UTF8,php中TTF支持UTF8编码的非ASCII字符输出.在分析这段代码之后,发现可以实现中文与ASCII混合输出图象,这样在我们操作图象函数时可以更方便. 代码如下: <? function gb2utf8($gb) { if(!trim($gb)) return $gb; $filename="gb2312.txt"; $tmp=file($filename); $codetable=array(); while(list($...
标签: 电脑入门
在使用excel时,我们常常会使用一些函数,本文中为大家介绍CONCATENATE函数的使用方法。 语法 CONCATENATE (text1,text2,...) Text1, text2, ... 为 1 到 30 个将要合并成单个文本项的文本项。这些文本项可以为文本字符串、数字或对单个单元格的引用。 说明 也可以用 &(和号)运算符代替函数 CONCATENATE 实现文本项的合并。 ...
标签: Web开发
如何在PHP图形函数中显示汉字,大家已经问了很久了,但一直没有结果。终于在参考另一篇文章后,我试验出来了! 方法: 首先,决定要显示哪些汉字,如“计数器”这三个字。 到Word2000(97不知可不可以)中去,输入这三个字,另存为,选择编码格式,然后再在右边的编码类型里选择unicode utf-8,记住不要选错了。存成一个编码格式的文本文...
标签: Web开发
!-- Writed by Zhong@IECN 2004.3.26 -- script language="javascript" var reIp = /^([01]?\d{1,2}|2[0-4]\d|25[0-5])(\.([01]?\d{1,2}|2[0-4]\d|25[0-5])){3}$/; //IP var reEml = /^[\w\-\.]+@[a-z0-9]+(\-[a-z0-9]+)?(\.[a-z0-9]+(\-[a-z0-9]+)?)*\.[a-z]{2,4}$/i; //E-mail var reTel = /^((\d{2,3}\-)?\d{2,5}\-)?[2-9]...

经验教程

374

收藏

56
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部