点阵墨水屏的使用以及图像预处理

 

    我们电子日历的产品,选用的屏幕尺寸为5.83寸,分辨率为648*480。屏幕本身支持黑白红三色,我们使用黑白两色,单色位图表示的话,每个位都能表示一个像素点。所以对于这个屏幕而言,要显示一整幅图,需要的字节数为 38880。然后,由于屏幕需要的只是像素点,所以不能直接将一个位图数据写进去,需要预先转换一下。然后屏幕本身对于像素点的处理方式的不同,也会导致图片的预处理过程不一样。

    对于这个墨水屏的屏幕而言,非专业人员读他们这个datasheet难度较大,各种术语和参数意义不是很容易看懂。我开发主要是先按照官方给的示例程序和图像跑一遍,然后基本跑通了大致的操作也就清楚了,然后开始看datasheet这么个流程。

    我们前后接触了三个厂商,一个是大连奇云电子,这个是纯从淘宝上找的一个,他们这个有四灰度的屏幕,我是用他们这个demo刷了一副太祖的画像进去想要膜拜一下,由于像素密度不太够,看起来效果不是很好,这个后边没有继续接触了。后边使用了龙宁科技和威锋科技的屏幕,我们之前很多产品也使用了他们俩的段码墨水屏,算是比较熟悉的了。电子日历这个产品,这两家的屏幕都调好了,现在可以通用。

    不论是哪个厂商,其上游技术都是元太科技垄断,厂家再进行二次开发。因此不论是硬件上还是软件上,基本都差不太多。屏幕本身带有一个简单的驱动IC,我们应用开发的话,主要是和这个IC打交道。IC提供了二十多个各种接口供选择,除了电源和GND之外,我们还使用了SPI(由于不需要读取屏幕的数据,少了一根MISO),RST复位、BUSY状态、BS选择SPI类型(这个一般只会采用一个,要么三线要么四线,如果硬件设计上直接拉低应该就不用这个了),CD命令/数据输入。   

    比较曲折的是,一开始技术方案没有考虑好,选择了最难的那种,想要实现根据文本样式和内容生成图像数据这样的复杂方案,研究FreeType怎么渲染文本,折腾了三个多星期,倒是把这玩意儿差不多给搞出来了。不过对于一个裸奔的MCU程序而言,自己渲染的实现过于复杂了。最后采用的简化方案是:直接下载一整副图像或者将小图标的数据进行组合显示出来。

    最开始厂家提供了一个软件,用于帮助从图像生成数据文件。    就是下面这货:

    按照厂家的说明可以使用这个软件快速提取一副图像的数据,刷入到demo中即可以运行。

    需要注意的是,用于生成数据的图像必须是单色位图,且分辨率必须和屏幕的分辨率严格对应,480*648或者648*480也可以。

    然后开始研究我们自己的应用场景。因为如果每出一张图都要手工使用这个软件生成数据再转换成bin文件放到服务器上,太麻烦了!所以得有一个可以自动根据图片生成h文件或者二进制文件的程序,因为都是我在研究屏幕相关的技术,所以由我自己来写预处理的程序。

    IC的分辨率为648*480,带FPC的那一边为下方。根据datasheet,扫描数据的时候,每个字节8位共可以表示8个像素,从左到右(或反过来,UD参数)逐个扫描直至填满本行所有的像素,扫完一行之后,根据SHL参数可以向上或者向下扫描第二行。

    

    我们这个日历,是竖着的,和屏厂默认的横着有90度的差。所以这里如果不想要美工MM每次都给出横着的日历,我就得在程序中处理这种转换。

秒秒测智能日历

    对于符合屏厂默认方向的数据而言,不论是从左到右从上到下还是反过来,写入一整个屏幕的数据为 每行81个字节*480行,所以如果应用的UI是648*480的分辨率的,提取图像的时候,可以直接按照逐行扫描每8个像素合并一个字节即可。但是如果是像我们这种竖着的,则不太一样。要符合屏幕的扫描逻辑,则应该改为每一列共8行合并一个字节,然后是从左向右从上向下还是反过来根据参数决定。这里我前期研究的时候,选定的方向是更适合理解的从左到右从上到下,不过实际上这不符合Bitmap的扫描方向,Bitmap是从左到右从下往上扫描的,导致处理图像的时候我需要额外翻转一下数据。

    然后Bitmap格式的图像本身也不全是像素。其文件格式为 文件头+信息头+调色板 三部分组成。其中文件头固定为14个字节,信息头为40个字节,然后颜色表的长度根据图片的颜色模式决定:24位或36位真彩色模式无颜色表,黑白单色图的颜色表大小是8字节,16色图像的颜色表大小是64字节,256色图像的颜色表大小是1024字节。每4字节表示一种颜色,并以B(蓝色)、G(绿色)、R(红色)、alpha(像素的透明度值,一般不需要)。即首先4字节表示颜色号0的颜色,接下来表示颜色号1的颜色,依此类推。

    以下定义为使用Visualstudio研究FreeType渲染Bitmap的时候梳理的Bitmap文件格式:

//位图文件头定义:
typedef struct  tagBITMAPFILEHEADER {
	WORD bfType;//位图类别,根据不同的操作系统而不同,在Windows中,此字段的值总为‘BM’

	DWORD bfSize; // 位图文件的大小,以字节为单位(3-6字节)

	WORD bfReserved1; // 位图文件保留字,必须为0(7-8字节)

	WORD bfReserved2; // 位图文件保留字,必须为0(9-10字节)

	DWORD bfOffBits; // 位图数据的起始位置,以相对于位图(11-14字节)
	// 文件头的偏移量表示,以字节为单位
}BITMAPFILEHEADER;  //14字节
//BMP位图信息头数据用于说明位图的尺寸等信息:
typedef struct tagBITMAPINFOHEADER {
	DWORD biSize; // 本结构所占用字节数(15-18字节)

	LONG biWidth; // 位图的宽度,以像素为单位(19-22字节)

	LONG biHeight; // 位图的高度,以像素为单位(23-26字节)

	WORD biPlanes; // 目标设备的级别,必须为1(27-
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值