S3C2440开发板上BMP图片的显示之三


三、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;//置位刷新显示标志;

}

你可能感兴趣的:(SD)