三、BMP图片显示功能扩展
1、图片显示的功能扩展
(1)能够调整图片的显示区域,比如我准备了一张 480x384的图片,液晶屏大小只有它的九分之一,要通过键盘控制,“看到整张图片”。
(2)能够显示单色、16色、256色、24位真彩色图片。
(3)能够对图片进行缩小显示,比如前面那个480x384的图片,能够缩小比例显示在液晶屏上。这个实现应该不难,但是放大就比较麻烦了,要用到数学上的插值,这个稍微做一下尝试。
2、图片的移动
(1)分析
首先一个要明确的概念,我们所谓“移动图片”,实质不是在移动图片,而是在移动观测图片的 “显示窗口”。
比如一张比显示屏大的图片,现在只显示了上半部分,我们要看它的下半部分,可以按下方向键“向下键”,我们在屏幕上看到图像在“向上移动”,但我们同时要能够联想到,实质此时,“我们是在拉着显示窗口往下移动,因此我们很快看到了图片的下半部分”。
(2)实现的思路
要实现显示窗口的移动,主要是调整“液晶屏的显示行列”与“位图文件像素行列”之间的关系。
进行一下模拟分析,一个图片文件大小为160x256,也就是我的液晶屏两倍大。初始状态显示上半部分:液晶的127行对应图片的127行,0对应0行。
现在我按下“向下”控制按钮,也就是显示窗口下移,液晶的127行应该显示图片的“127+X”行,液晶第0行显示图片的“0+X”行,这样我们观测到的图片就下移了“X”行。
如果我按下“向上”控制按钮,显示窗口上移,也就是液晶有一部分将“观测不到图片”,液晶的显示起始行就不是从第0行开始。从理论上来说,液晶第0行显示图片的第“-X”行,所以液晶显示应该是第X行显示图片文件的第0行。
我可以设置四个变量 LcdRow,LcdCol,BmpRow,BmpCol。
向下移动X行,BmpRow = LcdRow + X,向上移动为减去。
同理,向右移动,BmpCol = LcdCol + X,想左为减去。
同时还要考虑到液晶窗口的行列最大值、图片文件的高宽最大值。
(3)程序结构和流程设计
肯定需要循环,因为要从循环中接收串口命令:五个命令,上下左右,再加上退出命令。
设置一个标志位,控制显示的刷新。
而对于串口来的命令,主要是计算液晶的显示行列。然后更新显示标志位。在显示刷新后,又清除该标志。
(4)程序代码设计
先添加命令 mpshow,这个命令带一个参数,要显示的图片文件名。
最重要的是处理窗口移动的代码,由于代码较长,我这里只列出向左移动的代码:
if ( CtrlCode == 'a' ) { //如果是左移命令,d右移,s下移,w上移
Col_MovDist -= 32; //显示窗口左移32个像素,效果累加。
if ( Col_MovDist <= -160 ) { //向左移动距离超过液晶宽度
Col_MovDist = -160;
DispRefresh = 0;
Shell_ClearScreen( ); //窗口左移到看不见图片了。
continue;
}
else if ( Col_MovDist < 0 ) { //窗口左边有一段空白,没有像素
Lcd_StartCol = -Col_MovDist; //液晶显示起始列,从左移过去的像素数开始。对应图片的0列,这时起始列大于0.
Lcd_EndCol = ( 160 - Lcd_StartCol > PicInfo.BmpWidth )\
?Lcd_StartCol + PicInfo.BmpWidth-1: 159;
} //如果图片很窄,则液晶显示结束列小于159列。
else { //窗口左边界超过了位图左边界。
Lcd_StartCol = 0;
Lcd_EndCol = ( Col_MovDist + 160 > PicInfo.BmpWidth )\
? PicInfo.BmpWidth-Col_MovDist-1: 159;
}
Shell_ClearScreen( );//清屏;
DispRefresh =1;//置位刷新显示标志;
}