视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
bmp图片加载显示的两种方法
2025-10-06 04:42:23 责编:小OO
文档
一、图片添加、加载、显示和释放

在软件开发过程中,我们经常需要使用到图片,下面我们就来说说图片的加载和使用方法。

    我们的SDK平台目前只支持bmp格式的图片,其他格式如jpg、png等压缩格式的图片暂时不支持。

    下面我将详细讲解如何添加、加载、显示和释放一个24bit格式的文件名为plane.bmp的图片。

1添加图片资源方法

由于我们的程序最终会生成mrp格式文件,因此我们需要把要显示的图片先打包到mrp文件里面。添加文件的方法,是需要修改mpr格式的工程文件,该工程文件类似我们在Linux开发环境里的 makefile。

例如我们当前的工程文件为demo.mpr,那么我们在files组里面加入名字为的图片,如下图所示:

        

当我们编译mpr工程文件的时候,如果图片被成功打包到mrp文件中,那么在编译完成的时候,会有提示信息,如下图所示:

    

当要添加的图片不存在的时候,编译器报编译错误,如下图所示:

当编译通过,并且编译输出有看到图片被成功打包进mrp包里面,说明我们完成了在mpr工程文件里面增加图片的功能。

2从mrp包里面加载图片方法

我们这里说的图片加载是指在程序运行过程要显示mrp包里面的bmp图片时候,需要先将bmp加载到内存中的方法。

将bmp图片加载到内存中通常有两种方法,一种是通过调用mrc_readFileFromMrpEx函数;另一种是通过调用mrc_bitmapLoad函数。

    第一种加载图片的具体方法如下面代码所示:

在第一种图片加载方法里面,我使用了mrc_readFileFromMrpEx来从mrp中读取先前打包进去的图片。mrc_readFileFromMrpEx函数的原型如下:

它的功能就是从指定的packname mrp包里面读取文件名为filename的文件,当读取文件成功以后,通过filebuf和filelen来返回指定文件数据和数据长度,这里返回的文件的数据和长度,mrc_readFileFromMrpEx函数的详细使用说明可以查考mrc_base.h文件里面的函数说明。当mrc_readFileFromMrpEx函数调用返回成功以后,说明我们成功把加载到内存中,这里我们把加载的数据保存到bmp变量里面,该变量是一个T_ICON_MAP类型的指针变量,T_ICON_MAP结构体定义如下:

注意:利用mrc_readFileFromMrpEx函数加载图片资源成功以后,需要对返回的filebuf内存进行管理,到不使用图片资源的时候,需要进行是否,否则会造成内存泄露!

    第二种图片加载方法是通过使用mrc_bitmapLoad函数来实现的。

具体加载方法如下:

    

我们的SDK提供了30个图片缓冲区来管理图片资源,序号为0-29,用户可以通过调用mrc_bitmapLoad来把指定的图片从mrp包里面加载到图片缓冲区中。mrc_bitmapLoad函数的原型如下:

参数i为图片缓冲区序号,必须是0-29,filename为预加载图片文件名称,x,y为图片加载的起始坐标,w为预加载图片的宽度,h为预加载图片高度,max_w为图片原始宽度。这里图片的宽高分别为41和26,在这个例子中,我们把整张图片都加载到内存中,当然,需要的时候,我们可以只加载部分图片。当mrc_bitmapLoad函数调用返回成MR_SUCCESS时候,说明图片成功加载到指定的缓冲区中。

    到这里,我们就已经成功通过两种方法来加载图片。其实,mrc_readFileFromMrpEx函数不仅可以加载bmp图片,还可以加载其他任意类型的文件到内存中。

3 bmp图片显示方法

当我们成功把图片加载内存里面以后,接下来就需要把图片显示出来。同样地,图片的显示方法也有两种,并且与加载的方法是一一对应的。下面我们就来详细讲解图片的两种显示方法。

第一种显示方法如下:

    在该图片显示ShowBmp函数里面,我们使用了第一种图片加载方法LoadBmp函数返回的数据结构T_ICON_MAP。该种图片显示方法就是通过调用mrc_bitmapShowEx函数来实现图片显示。mrc_bitmapShowEx函数对输入的bmp数据缓冲区bmp->pdata进行显示。显示的图片效果如下图所示:

                

    plane图片是一张41X26的小飞机图片,上图中飞机图片屏幕居中显示。用户可能注意到了,该飞机图片的红色的背景图片怎么也显示出来了。这里就需要先了解一下mrc_bitmapShowEx函数的功能,该函数的原型如下:

参数p为图片数据,x、y为图片显示的起始坐标,mw为图片原始宽度,w、h为图片显示宽度和高度,sx、sy为原始图片中的坐标位置,rop为图片显示效果,其类型主要有BM_COPY和BM_TRANSPARENT。在ShowBmp函数里面rop的参数值为BM_COPY,即覆盖模式,图片中所有的数据都会显示出来,而BM_TRANSPARENT模式为透明色模式,图片的第一个像素为透明色,图片中与第一个像素相同颜色值的点不会显示处理。而在程序里面,我们经常需要进行透明色显示,例如图片,其实我们只想实现飞机本身部分而不显示红色背景。

下面我们就通过修改mrc_bitmapShowEx函数中的rop参数值来显示透明色图片,调用mrc_bitmapShowEx函数的代码修改为:

那么图片显示的效果如下图所示:

                    

通过上图,我们可以明显看出图片效果发生变化。但是需要注意的是,不同图片显示模式绘制过程所需要花费的时间有很大差异,其中BM_COPY模式是最节约时间,BM_TRANSPARENT和其他模式由于在图片绘制过程中需要进行大量运算,相对BM_COPY模式需要花费更多的时间。因此,在软件开发过程中应该尽量使用BM_COPY模式。

    第二种显示方法如下:

该方法是通过调用mrc_bitmapShow函数来实现图片显示,mrc_bitmapShow函数的原型如下:

该函数与mrc_bitmapShowEx函数的区别只是图片数据的输入参数不一样,该函数是从SDK管理的图片缓冲区中绘制图片,而调用mrc_bitmapShowEx函数的时候需要把自己管理的图片数据传入。

    mrc_bitmapShow函数调用以后效果如下:

                    

为了区分mrc_bitmapShowEx函数显示方法,这里我们在调用mrc_bitmapShow函数的时候,只显示一半宽度的图片。到这里,我们已经把两种bmp图片显示的加载和显示方法都给介绍完了。需要注意的是,上述介绍的加载和显示方法是针对24bit和16bit的bmp图片的,不适合8bit和小于8bit的bmp图片。

4 bmp图片释放方法

当图片使用完成以后,我们需要释放加载的图片所占用的内存资源。

对于不同的图片加载方法,其释放资源的方法也是不一样的。

第一种图片加载方式的释放方法如下:

        

由于第一种图片加载方法中,mrc_readFileFromMrpEx函数会从heap中分配空间,因此释放的时候,只需要通过调用free函数来释放heap内存资源就可以了。

第二种图片加载方式的释放方法如下:

由于第二种图片加载方式中,使用了SDK管理的图片缓冲区,因此释放资源的时候,也是通过调用mrc_bitmapLoad函数来实现的,只是将filename参数值设置为”*”。

通过上述两种方法,我们就可以释放图片加载后所消耗的内存资源。下载本文

显示全文
专题