OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 10766|回复: 3

bmp图片显示速度不怎么快,尝试开窗

[复制链接]

38

主题

2061

帖子

6

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3273
金钱
3273
注册时间
2012-1-16
在线时间
37 小时
发表于 2012-6-2 21:11:04 | 显示全部楼层 |阅读模式

//解码这个BMP文件                 
int BmpDecode(const TCHAR *file_path,FIL *filetemp)
{
    u16 count;         
 u8  rgb ,color_byte;
 u16 x ,y,color,tmp_color ;  
 u16 uiTemp;    //x轴方向像素计数器
 u16 countpix=0;//记录像素  
 //x,y的实际坐标 
 u8  realx=0;
 u8  x_end=0;
 u16 y_end=0;
 u16 realy=0;
 u8  yok=1; 
 FRESULT res;
 UINT br;
       
 BITMAPINFO *pbmp;//临时指针        
 f_read(filetemp,bmp_buffer,512,&br);//读取512字节  
 pbmp=(BITMAPINFO*)bmp_buffer;//得到BMP的头部信息  
 count=pbmp->bmfHeader.bfOffBits;        //数据偏移,得到数据段的开始地址
 color_byte=pbmp->bmiHeader.biBitCount/8;//彩色位 16/24/32 
 ICINFO.ImgHeight=pbmp->bmiHeader.biHeight;//得到图片高度
 ICINFO.ImgWidth=pbmp->bmiHeader.biWidth;  //得到图片宽度  
 //水平像素必须是4的倍数!!
 if((PICINFO.ImgWidth*color_byte)%4)
  uiTemp=((PICINFO.ImgWidth*color_byte)/4+1)*4;
 else
  uiTemp=PICINFO.ImgWidth*color_byte;    
 AI_Drow_Init();//初始化智能画图    
 //开始解码BMP                  
 x =0 ;
// y=PICINFO.ImgHeight;
 y = 0;
 rgb=0;     
 realy=y*PICINFO.Div_Fac/10000;

 x_end = PICINFO.S_XOFF+PICINFO.ImgWidth*PICINFO.Div_Fac/10000;
 y_end = PICINFO.S_YOFF+PICINFO.ImgHeight*PICINFO.Div_Fac/10000;

 LCD_SetWindow(PICINFO.S_XOFF,PICINFO.S_YOFF,x_end,y_end);  //开窗

 while(1)
 {    
  while(count<512) 
     {
   if(color_byte==3)   //24位颜色图
   {
    switch (rgb)
    {
     case 0:
      tmp_color = bmp_buffer[count]>>3 ;
      color |= tmp_color;
      break ;   
     case 1:
      tmp_color = bmp_buffer[count]>>2 ;
      tmp_color <<= 5 ;
      color |= tmp_color ;
      break;  
     case 2 :
      tmp_color = bmp_buffer[count]>>3 ;
      tmp_color <<= 11 ;
      color |= tmp_color ;
      break ;   
    }  
   }
   else
   {
    if(color_byte==2)  //16位颜色图
    {
     switch(rgb)
     {
      case 0 :
       color=bmp_buffer[count]&0x1f;
          tmp_color=bmp_buffer[count]>>5;
       tmp_color<<=6;
       color|=tmp_color;
       break ;  
      case 1 :     
       tmp_color=bmp_buffer[count];
       tmp_color<<=9 ;
       color |= tmp_color ;
       break ; 
     }      
    }
    else
    {
     if(color_byte==4)//32位颜色图
     {
      switch (rgb)
      {
       case 0 : 
        tmp_color=bmp_buffer[count];
        color|=tmp_color>>3;
        break ;    
       case 1 : 
        tmp_color=bmp_buffer[count];
        tmp_color>>=2;
        color|=tmp_color<<5;
        break ;  
       case 2 : 
        tmp_color=bmp_buffer[count];
        tmp_color>>=3;
        color|=tmp_color<<11;
        break ; 
       case 3 :break ;  
      }     
     } 
    }    
   }//位图颜色得到 
   rgb++;  
   count++ ;   
   if(rgb==color_byte) //水平方向读取到1像素数数据后显示
   { 
    if(x<ICINFO.ImgWidth)             
    { 
     realx=x*PICINFO.Div_Fac/10000;//x轴实际值
     if(IsElementOk(realx,realy,1)&&yok)//符合条件
     {                      
      OINT_COLOR=color; 
     // LCD_DrawPoint(realx+PICINFO.S_XOFF,realy+PICINFO.S_YOFF);  
      LCD_WR_DATA(color);
     }               
    }
    x++;//x轴增加一个像素
    color=0x00;
    rgb=0;     
   }
   countpix++;//像素累加
   if(countpix>=uiTemp)//水平方向像素值到了.换行
   {  
     y++;
    if(y>ICINFO.ImgHeight)return TRUE;
    realy=y*PICINFO.Div_Fac/10000;//实际y值改变 
    if(IsElementOk(realx,realy,0))yok=1;//此处不改变PICINFO.staticx,y的值 
    else yok=0;
    x=0;
    countpix=0;
    color=0x00;
    rgb=0;
    
   } 
  }
     res = f_read(filetemp,bmp_buffer,512,&br);  
  if(res||br==0) break;
   count=0 ;
 }  
 return TRUE;//BMP显示结束.           
}
我实验失败了,请问思路有没有没问题?谁可以分析下为什么会这么慢吗?(不开窗的时候)比如像素过多.

我实验失败了是图片显示不正确,感觉速度没什么变化。

站在巨人的肩膀上不断的前进。。。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

38

主题

2061

帖子

6

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3273
金钱
3273
注册时间
2012-1-16
在线时间
37 小时
 楼主| 发表于 2012-6-2 21:23:47 | 显示全部楼层
估计采用FSMC驱动更快些,但是如果是获取颜色值时间太长,这也没什么大的作用。不知道试过FSMC的朋友感觉怎么样。图片显示是乱的,不知道哪里出错了。
站在巨人的肩膀上不断的前进。。。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-6-3 00:47:29 | 显示全部楼层
sdio会好很多
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

4

主题

55

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
202
金钱
202
注册时间
2012-5-8
在线时间
19 小时
发表于 2012-6-4 18:38:51 | 显示全部楼层
先get到图片的width&height,然后设定LCD RAM Window,应该没有问题;另外,还要注意LCD的扫描方式,不然图像会花掉的哦~
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-26 04:31

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表