STM32
直播中

袁喆

8年用户 177经验值
私信 关注
[问答]

bmp图片显示速度不怎么快怎么解决?

//解码这个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     {
     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显示结束.            
}
我实验失败了,请问思路有没有没问题?谁可以分析下为什么会这么慢吗?(不开窗的时候)比如像素过多.
我实验失败了是图片显示不正确,感觉速度没什么变化。

回帖(2)

李如昊

2020-5-22 09:12:25
估计采用FSMC驱动更快些,但是如果是获取颜色值时间太长,这也没什么大的作用。不知道试过FSMC的朋友感觉怎么样。图片显示是乱的,不知道哪里出错了。
举报

王波

2020-5-22 09:19:44
sdio会好很多
举报

更多回帖

发帖
×
20
完善资料,
赚取积分