高级会员

- 积分
- 727
- 金钱
- 727
- 注册时间
- 2011-11-22
- 在线时间
- 10 小时
|

楼主 |
发表于 2011-12-18 20:48:10
|
显示全部楼层
看你的例程好像也没用哦,怎么就能实现那个效果,好像也是将读到的数据直接发出来显示的。
BOOL BmpDecode(FileInfoStruct *BmpFileName)
{
u16 count;
u8 rgb ,color_byte;
u16 x ,y,color,tmp_color ;
u16 uiTemp; //x轴方向像素计数器
u16 countpix=0;//记录像素
//x,y的实际坐标
u8 realx=0;
u16 realy=0;
u8 yok=1;
BITMAPINFO *pbmp;//临时指针
CurFile=BmpFileName;
F_Open(CurFile);//打开文件
F_Read(CurFile,jpg_buffer);//读出512个字节
pbmp=(BITMAPINFO*)jpg_buffer;//得到BMP的头部信息
count=pbmp->bmfHeader.bfOffBits; //数据偏移,得到数据段的开始地址
color_byte=pbmp->bmiHeader.biBitCount/8;//彩色位 16/24/32
PICINFO.ImgHeight=pbmp->bmiHeader.biHeight;//得到图片高度
PICINFO.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;
rgb=0;
realy=y*PICINFO.Div_Fac/10000;
while(1)
{
while(count<512) //读取一簇512扇区 (SectorsPerClust 每簇扇区数)
{
if(color_byte==3) //24位颜色图
{
switch (rgb)
{
case 0:
tmp_color = jpg_buffer[count]>>3 ;
color |= tmp_color;
break ;
case 1:
tmp_color = jpg_buffer[count]>>2 ;
tmp_color <<= 5 ;
color |= tmp_color ;
break;
case 2:
tmp_color = jpg_buffer[count]>>3 ;
tmp_color <<= 11 ;
color |= tmp_color ;
break ;
}
}
else
{
if(color_byte==2) //16位颜色图
{
switch(rgb)
{
case 0:
color=jpg_buffer[count]&0x1f;
tmp_color=jpg_buffer[count]>>5;
tmp_color<<=6;
color|=tmp_color;
break ;
case 1:
tmp_color=jpg_buffer[count];
tmp_color<<=9 ;
color |= tmp_color ;
break ;
}
}
else
{
if(color_byte==4)//32位颜色图
{
switch (rgb)
{
case 0:
tmp_color=jpg_buffer[count];
color|=tmp_color>>3;
break ;
case 1:
tmp_color=jpg_buffer[count];
tmp_color>>=2;
color|=tmp_color<<5;
break ;
case 2:
tmp_color=jpg_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)//符合条件
{
POINT_COLOR=color;
LCD_DrawPoint(realx+PICINFO.S_XOFF,realy+PICINFO.S_YOFF-1);
}
}
x++;//x轴增加一个像素
color=0x00;
rgb=0;
}
countpix++;//像素累加
if(countpix>=uiTemp)//水平方向像素值到了.换行
{
y--;
if(y<=0)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;
}
}
if(!F_Read(CurFile,jpg_buffer))break;//读出512个字节,读数失败时自动退出
count=0 ;
}
return TRUE;//BMP显示结束. |
|