关于提升仿动态图显示速度的一点想法

典型的BMP图像文件由四部分组成:
1:位图头文件数据结构,它包含BMP图像文件的类型、显示内容等信息;
2:位图信息数据结构,它包含有BMP图像的宽、高、压缩方法,以及定义颜色等信息;
3:调色板,这个部分是可选的,有些位图需要调色板,有些位图,比如真彩色图(24位的BMP)就不需要调色板;
4:位图数据,这部分的内容根据BMP位图使用的位数不同而不同,在24位图中直接使用RGB,而其他的小于24位的使用调色板中颜色索引值。
其中位图文件数据结构为14个字节,结构组成如下:
typedef struct tagBITMAPFILEHEADER
{
WORD bfType;//位图文件的类型,必须为BM(1-2字节)
DWORD bfSize;//位图文件的大小,以字节为单位(3-6字节,低位在前)
WORD bfReserved1;//位图文件保留字,必须为0(7-8字节)
WORD bfReserved2;//位图文件保留字,必须为0(9-10字节)
DWORD bfOffBits;//位图数据的起始位置,以相对于位图(11-14字节,低位在前)
//文件头的偏移量表示,以字节为单位
}attribute((packed)) BITMAPFILEHEADER;
在32位MCU中要注意字节对齐,否则读取出来的数据可能会对不上,该结构体中的bfsize元素,代表的是整个bmp文件的大小,也就是bmp文件4个部分的总大小。
位图信息数据结构位40个字节,结构组成如下:
typedef struct tagBITMAPINFOHEADER
{
DWORD biSize;//本结构所占用字节数(15-18字节)
LONG biWidth;//位图的宽度,以像素为单位(19-22字节)
LONG biHeight;//位图的高度,以像素为单位(23-26字节)
WORD biPlanes;//目标设备的级别,必须为1(27-28字节)
WORD biBitCount;//每个像素所需的位数,必须是1(双色),(29-30字节)
//4(16色),8(256色)16(高彩色)或24(真彩色)之一
DWORD biCompression;//位图压缩类型,必须是0(不压缩),(31-34字节)
//1(BI_RLE8压缩类型)或2(BI_RLE4压缩类型)之一
DWORD biSizeImage;//位图的大小(其中包含了为了补齐行数是4的倍数而添加的空字节),以字节为单位(35-38字节)
LONG biXPelsPerMeter;//位图水平分辨率,每米像素数(39-42字节)
LONG biYPelsPerMeter;//位图垂直分辨率,每米像素数(43-46字节)
DWORD biClrUsed;//位图实际使用的颜色表中的颜色数(47-50字节)
DWORD biClrImportant;//位图显示过程中重要的颜色数(51-54字节)
}attribute((packed)) BITMAPINFOHEADER;
有颜色表的bmp文件中,颜色表的大小一般位16个字节。
位图数据:
一般位图数据的记录顺序是从左到右,从下到上,所以图片的有效数据是倒着存储的,也就是第一行的数据一般在文件的最末尾,最后一行数据在文件的颜色表的后面,所以当我们调用ucgui的显示函数画图时,uigui的内部函数是,从文件底部数据开始一行一行的读取,然后显示在屏幕上,但是这样速度会比较慢;而且图片数据是以四字节对齐的,而且当图片的宽度为奇数,图片数据每行后面补零,保证数据是四字节对齐,这时ucgui内部会对这些补齐的数据进行处理,这同样会造成时间的浪费。
我们可以自己编写一个读取函数,先读取两个文件结构的信息,得到每帧bmp图片的大小,宽度,高度,数据偏移量,然后再根据数据偏移量读取图片有效数据,这时我们可以一次读取多行数据,因为每行数据量是相等的,所以我们也很容易对补零的数据进行处理,这样就可以显著提升仿动态图的显示效果,防止刷屏水纹的出现。

你可能感兴趣的:(GUI)