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