其实现实原理都是一样的啊,只是读取的数据量不同而已,文字是一个一个的字模(一般是单色),而图片分辨率更高,还有颜色而已。
其实现实的关键就是找到图片像素和 显示屏像素的对应关系(毕竟大多数时候,二者不是一一对应,而是一种映射转换),这又涉及
1. 图片数据的解析
2. 图片像素到屏幕显示点的映射关系
这之后就是按映射关系一一在屏幕上显示的问题啦。
--------------------
有人在论坛里投诉我,说我上面的问题回答不够全面,那我就补充到下面:
前面说了其实显示图片和显示文本没有根本的区别,只是图像像素问题,这点,我想你应该能理解吧,对于具体的全屏显示图片,上面提到了要找到全屏各点与图片各点对应关系问题,我想这点你也该能理解吧?不过这点其实实际处理中又分为多种情况
1. 图片像素(分辨率)和屏幕像素恰好全对应,这是特例
2. 图片分辨率的长或者宽小于屏幕,对此有几种处理(略写你自己补充):
2.1 不处理分辨率适配放大,直接按图片分辨率显示,这又涉及图片放置位置的问题:
2.1.1 靠顶,又分为
2.1.1.1 顶左
2.1.1.2 顶中
2.1.1.3 顶右
2.1.2 居竖直中,又分为
2.1.2.1 中左
......
2.1.3 居竖直底,又分为
2.1.3.1 底左
.......
2.2 填满适配屏幕,则涉及到图片放大问题,要根据一定的取色原则来取色,不过比较好的是lcd19264是单色屏,你取一个阀值作为插值处理时插值计算出值是否显示的标准,来计算出屏幕各点对应图片像素值(其实这里可以理解为构造一个和屏幕分辨率相同的单色图映射处理,相应处理可以参考图像处理算法介绍)
3. 图片分辨率中又存在一个比屏幕分辨率大、一个比屏幕分辨率小,这也 如2类似有很多种处理策略,如局部裁剪、放缩等等,请你自己按前面的进行补充(类似存在位置处理问题、裁剪关系处理问题、放缩计算问题)
.....
根据上面的处理,其实最终得到了一个192x64分辨率的图像啦,这时就需要在屏幕中进行填充,这个你文本显示中其实用到了同样的处理,不需要我再介绍啦吧?如果还觉得不满足,我们再聊。可以聊的其实还有很多,比如不同图片格式的解析、多色图、灰度图转换为单色图的处理,这些有些是多媒体数据处理问题,有些是计算机图形学的知识。
你那么一句话问,我回答了这么多,还不够?建议先学习下“提问的智慧”。
下面是函数伪代码
int DrawAll( char bmp[192][8] ){
// bmp 是一个按前述要求处理好的 分辨率为192x64 bit,来表征图像的 数组,
// 因为lcd19264实际上是3个64x64区域,所以还需要对bmp数据再切分,比如bmp其实是 char bmp[192][8],则每个64x64对应像素分别为
char A0[64][8]={0};
char A1[64][8]={0};
char A2[64][8]={0};
int i;
int j;
for(i=0;i<64;i++){
for(j=0;j<8;j++){
A0[i][j]=bmp[i][j];
A1[i][j]=bmp[64+i][j];
A2[i][j]=bmp[128+i][j];
}
}
// 调用你底层的驱动函数显示64x64数据到每个屏幕的64x64块中,比如假设你的驱动函数是
// _drawX( int i // 在那个64x64区域绘制
// int x
// int y // 区域内的x,y
// char bmp[64][64] // 区域对应的64x64图像区域
// )
_drawX(0 0 0 A0);
_drawX(1 0 0 A1);
_drawX(2 0 0 A2);
return 0;
}
-----------
吐槽:社区贴代码吃逗号的问题还是没有解决啊!