原创 STM32开发板上BMP图片的显示之三

2010-4-7 21:45 7773 5 5 分类: MCU/ 嵌入式

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

 


三、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行。


我可以设置四个变量 LcdRowLcdColBmpRowBmpCol


向下移动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;//置位刷新显示标志;


}


 


显示效果如下图所示,晚上拍的,不太清晰。这里三幅图片,我主要是用了上下移动的命令:


 


 38c8ecc3-1031-4efe-871a-53906cbc3af2.jpg


0e34f989-17b5-4fb2-a129-fc88b2af31fc.jpg


 

b342873f-0ff9-42cf-b170-a9208b41aded.jpg


 


 


 


 


 


 


 

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
5
关闭 站长推荐上一条 /3 下一条