Paint_Bmp

(原创)裸奔 第2章 学习总结

    上次,做图片显示实验,没有看如果转换的图片不是320X240,将会显示什么。这次玩LCD,提示我,看看在显示图片的时候,不是屏幕分辨率大小的,会是什么现象。

      首先,调用显示图片的函数:
      Paint_Bmp(int x0,int y0,int h,int l,unsigned char bmp[]),x0,y0表示在屏幕上的显示位置(同时也是原作者所说的bug所在),h为图片的宽度,l为图片的高度。bmp[]为存储图片信息的数组。
     于是,我就在网上下了一张图片分辨率为:220X161,这样调用函数 Paint_Bmp(0,0,220, l61,small),small就是包好图片220X161信息的数组,放在TQ_LOGO.c中。发现小图片的地方能够显示在屏幕上。但余下没有被赋值的像素点,保存着上一张图片的信息。
      改变y0的值,图片可以上下移动。但是如果改变x0的值,图片却花了,不能正常显示。并不是想像中的左右移。这是因为,LCD是被逐行扫描的,首先填充第1行,逐渐填充到第240行。你改变y0的值,相当于改变了行数,而你改变x0数,就改变了列数。但在small中信息都是按行列存储好了。你改变了x0,把原本属于第一行像素的值,变成了第二行。所以后面的信息全都乱了套。因为small数组是一个一维数组,并不是按照行列存储信息的二维数组。
    

Paint_Bmp函数分析:  

     void Paint_Bmp(int x0,int y0,int h,int l,unsigned char bmp[])
{

int x,y;   ------x、y逐行扫描计数
U32 c; -------存储一个像素点的信息
int p = 0;  

   for( y = y0 ; y < l ; y++ ) --------逐行扫描
  
{
    for( x = x0 ; x < h ; x++ )
------一行有h-x0个像素
    
{
       c = bmp[p+1] | (bmp[p]<<8) ;
--------数组中的每2个值,作为一个像素点的值,共16位

    if ( ( (x0+x) < SCR_XSIZE_TFT) && ( (y0+y) < SCR_YSIZE_TFT) ) -----在LCD.h中定义为320X240
     LCD_BUFFER[y0+y][x0+x] = c ;
-----将像素的值,赋值给数组。
   
    p = p + 2 ; --------因为数组中的2个值,代表一个像素
   }
    }
}

所以,在裸奔程序中,原作者改了程序。使小程序能够显示,可以调节x0、y0改变图片位置。

   关于kobe篮,RGB,兴趣不是很大。对那个算法,研究兴趣不是很大,不必浪费时间。

 

 

 

若将x0 y0 h l 当做首和尾坐标,那么可以写成

void Paint_Bmp(int x0,int y0,int h,int l,unsigned char bmp[])
{
 int x,y;
 U32 c;
 int p = 0;
 
    for( y = y0 ; y < l ; y++ )
    {
     for( x = x0 ; x < h ; x++ )
     {
      c = bmp[p+1] | (bmp[p]<<8) ;

 //  if ( ( (x0+x) < SCR_XSIZE_TFT) && ( (y0+y) < SCR_YSIZE_TFT) )
 //   LCD_BUFFER[y0+y][x0+x] = c ;
     if ( ( (x) < SCR_XSIZE_TFT) && ( (y) < SCR_YSIZE_TFT) )
     LCD_BUFFER[y][x] = c;
   
      p = p + 2 ;
     }
    }
}

结果和原作者修改的一样

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值