【GD32E503评测】08 综合评测之数码相册(一)
[复制链接]
本帖最后由 caizhiwei 于 2021-2-15 21:13 编辑
图片显示另外一个重要的特点就是他的数据量很大,比如画一幅 320*240 的图像,以16 位色计算,那么光颜色的数据量就有: 320*240*2=153600 字节。这其中还不包括设置坐
标的过程,如果加上坐标设置,数据量就是颜色数据量的 5 倍(每次坐标设置需要发送 5次命令/数据)以上。所以尽量优化画点过程,才能使你的图片显示得流畅。
单纯的画点,显然无法做太多优化,因为坐标设置是必须的。幸好,我们 ALIENTEK 所使用的液晶都是支持开窗显示以及坐标自增显示的。这样,我们只需要设置一次窗口,然后
设置一次坐标,就可以不停的往 LCD 写颜色数据,而不需要再做地址设置了。这样可以使得速度比单纯的画点显示要快至少5倍以上。
这里必须要借助一个小软件:Image2lcd
Image2Lcd 是一款非常好的图像工具软件,它能把各种来源的图片转换成特定的数据格式以用来匹配单片机系统所需要的显示数据格式。 Image2Lcd 支持的输入图像格式包括:
BMP, WBMP, JPG, GIF, WMF, EMF, ICO, 等等。 Image2Lcd 的输出数据类型包括定制的二进制类型、 C 语言数组类型和标准的 BMP 格式、 WBMP 格式。 Image2Lcd 能可视调节输入图象的数据扫描方式、灰度(颜色数)、图像数据排列方式、亮度、对比度、等等。对于包含了图像头数据保存的图像数据文件, Image2Lcd 能重新打开作为输入图像。因为 image2lcd 能生成带图像数据头的数据文件,使得我们处理起来方便很多,这里我们仅以 16 位真彩色为例进行说明。在该软件的帮助文件查到对“4096 色/16 位真彩色/18 位真彩色/24 位真彩色/32 位真彩
色”图片,其生成的图像数据头的结构为:
typedef struct
{
unsigned char scan;
unsigned char gray;
unsigned short w;
unsigned short h;
unsigned char is565;
unsigned char rgb;
}IMG_Head; /*图片头*/
头文件有了,接下来就是取模,取模设置我也摸索了好久,不过终于是成功了,如下图所示:
此结构体的讲解如下:
各个成员的功能描述如下:
scan: 扫描模式
Bit7: 0:自左至右扫描, 1:自右至左扫描。
Bit6: 0:自顶至底扫描, 1:自底至顶扫描。
Bit5: 0:字节内象素数据从高位到低位排列, 1:字节内象素数据从低位到高位排列。
Bit4: 0:WORD 类型高低位字节顺序与 PC 相同, 1:WORD 类型高低位字节顺序与 PC 相反。
Bit3~2: 保留。
Bit1~0: [00]水平扫描, [01]垂直扫描, [10]数据水平,字节垂直, [11]数据垂直,字节水平。
gray: 灰度值, 1:单色, 2:四灰, 4:十六灰, 8:256 色, 12:4096 色, 16:16 位彩色, 24:24 位彩
色, 32:32 位彩色。
w: 图像的宽度。
h: 图像的高度。
is565: 在 4096 色模式下为 0 表示使用[16bits(WORD)]格式,此时图像数据中每个 WORD 表示
一个象素;为 1 表示使用[12bits(连续字节流)]格式,此时连续排列的每 12Bits 代表一个象素。
在 16 位彩色模式下为 0 表示 R G B 颜色分量所占用的位数都为 5Bits,为 1 表示 R G B 颜色
分量所占用的位数分别为 5Bits,6Bits,5Bits。
在 18 位彩色模式下为 0 表示"6Bits in Low Byte",为 1 表示"6Bits in High Byte"。
在 24 位彩色和 32 位彩色模式下 is565 无效。
rgb: 描述 R G B 颜色分量的排列顺序, rgb 中每 2Bits 表示一种颜色分量, [00]表示空白, [01]
表示 Red, [10]表示 Green, [11]表示 Blue。
在 IMG_Head 中, scan, w, h 这三个参数对我们的图片显示尤为有用。 知道了 w 和 h,
就可以直到开窗的大小。而 scan 的最高两位,则代表了图片数据生成时的扫描方向,也就
是我们开窗后地址自增的方向。 知道了这几个参数,我们就可以很方便的解析各种大小,各
种扫描方式的图片数据了。
然后再写画图函数,参看了下历程中的函数,感觉写的很low,我需要计算每一个图片的xy起始和结束;
而我写的接口入参只需要其实坐标+ 图片指针即可,自动计算图片的高度和宽度。
有了这个接口:主函数中调用即可:
char_format_struct char_format;
char error_string[]="Hello,eeworld!";
/* configure char format */
char_format.char_color = LCD_COLOR_RED;
char_format.bk_color = LCD_COLOR_WHITE;
char_format.font = CHAR_FONT_8_16;
lcd_str_display(8,8, error_string, strlen(error_string), char_format);
lcd_picture_draw(0,0,(uint16_t *)(gImage_maomao));
//lcd_chinese_display(0,50,"电子工程世界",char_format);
至此,主要流程就讲完了。
总结:
1. 后续把图片存放在sd卡中,这样就不需要取模了;
看看效果图:
|