文件IO学习笔记第十二章:BMP图像原理与应用

      大家好,我是小智!

      实际项目开发过程中只在LCD液晶屏显示单一的颜色并不能满足设计需求,为了实现人机交互以及提供用户体验,UI工程师都需要设计符合产品主题的图像素材,然后提交给软件工程师进行人机界面的交互设计。由于Linux系统一切皆文件的特性,所以图片在Linux系统中也是以文件的形式存储。

图像格式

      图像中的数据必须按照某个已知的、公认的数据存储顺序和结构进行存储,这样才可以使不同的应用程序对该图像文件顺利的进行访问,从而实现数据共享。图像数据在文件中的存储顺序和结构也被称为图像文件格式。

image

      目前广为流传的图像文件格式有许多,常见格式包括BMP、GIF、JPEG、TIFF、MPEG等。在各种图像文件格式中,一部分是由某个软硬件厂商提出并被广泛接受和采用的格式,例如 BMP格式就是由微软公司(MicroSoft)公司发明的数据封装格式。另一部分是由各种国际标准组织提出的格式,例如JPEG格式是由ISO和ITU-T下属的联合图像专家组(JPEG)共同制定的静止图像压缩标准。

基本概念

      BMP格式最大的特征是没有任何的压缩,因此文件尺寸比较大,不适合网络传输,但是优点是这种图像格式中的数据读取出来不需要任何解码器解码就可以直接使用,所以为了便于大家对图像格式进行了解,就先以BMP格式进行讲解。

image

      BMP格式被称为位图(Bitmap)或设备无关位图(DIB,指的是Device-Independent Bitmap),是Windows操作系统所推荐和支持的图像文件格式,是一种将内存或显示器的图像数据不经过压缩而直接按位存盘的文件格式,所以这种格式的图片也被称为BMP文件。

内部结构

      BMP文件的数据按照从文件头开始的先后顺序分为四个部分:分别是位图文件头、位图信息头、调色板(24bit位图是没有的)、位图数据(RGB)。

image

如上图,BMP文件的位图文件头和位图信息头一共为54字节大小,其中位图文件头为14字节,位图信息头为40字节。

位图文件头

      如下图,位图文件头(Bitmap-File Header)包含了图像类型、图像大小、两个保留字以及位图数据存放地址。

image

位图信息头

位图信息头(Bitmap-Information Header)包含了位图信息头的大小、图像的宽和高、图像的色深、压缩说明、图像数据的大小和其他一些参数。

image

调色板

      bmp位图按照像素深度分类可以分为:1bit位图(2色)、4bit位图(16色)、8bit位图(256色)、16bit位图(65536色-高彩色)、24bit位图(1670万色-真彩色)、32bit位图(1670万色-增强型真彩色)。

      调色板是为了让一些颜色深度比较小(1bit、4bit、8bit)的位图可以表示颜色而设置的。调色板存储颜色,后面的位图数据存储颜色索引,这样调色板+位图数据就可以表示颜色了。

需要注意的是:16bit、24bit、32bit的位图一般没有调色板,因为从16bit开始就直接使用位图数据表示颜色了。

image

位图数据

      位图数据分两种情况,如果带调色板,则位图数据存放的是调色板的颜色索引,如果不带调色板,则位图数据存放实际的argb值。由于24位bmp图片不带调色板,所以文件开头的54字节为图片信息,从第55个字节开始就为bmp图片的颜色数据。

对齐说明

  • 思考:计算当前这张BMP图片的总大小(按字节为单位计算),提示:1个像素点3字节!

image

回答:

  1. 计算机的CPU为了提高工作效率,所以读取数据的时候会进行字节对齐,一般图像刷新都是行为单位,所以CPU每次都是读取一行的大小,所以32bit系统下如果一行字节大小不是4的倍数,就会进行字节补齐,目的是提高效率,是典型的用空间来换时间的案例!

  2. 分辨率是10*10,每行10个像素点,每个像素点3字节,所以一行是30个字节,不够4的倍数,所以需要在每行的末尾补2个字节。

  3. 由于每行必须是4的倍数,所以需要补齐的字节数有4种情况:0、1、2、3,所以需要设计算法来计算每行需要自动补齐的字节数。公式:byte = ( 4 - (width*3 % 4) ) % 4

存储顺序

      如果打算了解BMP图片内部数据的存储顺序(大端 or 小端),应该去查看BMP文件内部数据结构,需要使用专业工具(HEX十六进制查看器)。

image

通过分析,可以知道BMP图片内部数据是采用小端方式进行存储,千万要背下来!!!!!

像素结构

image

练习

  • 设计程序,利用系统IO读取磁盘上指定BMP图片的宽和高,以及BMP图片的大小,并输出到终端,要求图片名称通过命令行传递。

image

  • 设计程序,实现在LCD上显示一张分辨率为800*480大小的24bit的bmp图片,要求图像不失真可以在开发板的LCD上显示。

  • 设计程序,实现在LCD上任意位置显示一张任意大小的色深为24bit的bmp图片,要求图像不失真可以在开发板的LCD上显示。

  • 设计算法,要求把一张任意尺寸的BMP图片等比例且不失真的缩小为原来的1/2,并生成一张新的BMP图片,要求BMP图片的路径都需要通过命令行进行传递

posted @ 2025-06-02 16:20  努力赚钱的小智  阅读(78)  评论(0)    收藏  举报