//SRAM缩减优化后,消耗SRAM:12288BYTE
//移植到了SD卡上,可以解码JPEG/JPG和BMP
//同时支持两种格式的图片显示了
//对代码进行了初步优化
//对JPEG格式,把不应该显示的列和行的颜色计算省去了.
//在显示大图片的时候,速度明显提高
//对BMP,优化了显示支持,对大图片的行和列也进行了取舍
//把不应该显示的行和列去掉.同时把LCD显示模式设置为自动
//添加,提高了速度.
//对BMP,支持16bit 24bit 和32bit图片显示
//对JPG,基本只支持JFIF格式
//如果不是JFIF格式,用windows的画图打开然后保存一下,就是这个格式了!
//正点原子@HYW
//2009.04.21
//V1.4
#include "NEWBMP.H"
//////////////////////////////////////////////////
//全局变量声明,BMP和JPEG共用
FileInfoStruct *CurFile;//当前解码/操作的文件
//图像信息
typedef struct
{
u16 ImgWidth; //图像的实际宽度和高度
u16 ImgHeight;
float Div_Fac;//缩放系数
u16 S_Height; //设定的高度和宽度
u16 S_Width;
u8 S_XOFF; //x轴和y轴的偏移量
u16 S_YOFF;
u8 staticx; //当前显示到的xy坐标
u16 staticy;
}PIC_POS;
PIC_POS PICINFO;//图像位置信息
//数据缓冲区
extern unsigned char jpg_buffer[1024];//数据缓存区
BOOL AI_LoadPicFile(FileInfoStruct *FileName,u8 sx,u16 sy,u8 ex,u16 ey);//智能显示图片
void AI_Drow_Init(void); //智能画图,初始化.得到比例因子PICINFO.Div_Fac
//////////////////////////////////////////////////
//在JPEG函数里面用到的变量
short SampRate_Y_H,SampRate_Y_V;
short SampRate_U_H,SampRate_U_V;
short SampRate_V_H,SampRate_V_V;
short H_YtoU,V_YtoU,H_YtoV,V_YtoV;
short Y_in_MCU,U_in_MCU,V_in_MCU;
unsigned char *lp;//取代lpJpegBuf
short qt_table[3][64];
short comp_num;
BYTE comp_index[3];
BYTE YDcIndex,YAcIndex,UVDcIndex,UVAcIndex;
BYTE HufTabIndex;
short *YQtTable,*UQtTable,*VQtTable;
short code_pos_table[4][16],code_len_table[4][16];
unsigned short code_value_table[4][256];
unsigned short huf_max_value[4][16],huf_min_value[4][16];
short BitPos,CurByte;//byte的第几位,当前byte
short rrun,vvalue;
short MCUBuffer[10*64];
short QtZzMCUBuffer[10*64];
short BlockBuffer[64];
short ycoef,ucoef,vcoef;
BOOL IntervalFlag;
short interval=0;
short Y[4*64],U[4*64],V[4*64];//
DWORD sizei,sizej;
short restart;
long iclip[1024];//4k BYTES
long *iclp;
//初始化智能画点
void AI_Drow_Init(void)
{
float temp;
temp=(float)PICINFO.S_Width/PICINFO.ImgWidth;
PICINFO.Div_Fac=(float)PICINFO.S_Height/PICINFO.ImgHeight;
if(temp<PICINFO.Div_Fac)PICINFO.Div_Fac=temp;
if(PICINFO.Div_Fac>1)PICINFO.Div_Fac=1;
//使图片处于所给区域的中间
PICINFO.S_XOFF+=(PICINFO.S_Width-PICINFO.Div_Fac*PICINFO.ImgWidth)/2;
PICINFO.S_YOFF+=(PICINFO.S_Height-PICINFO.Div_Fac*PICINFO.ImgHeight)/2;
PICINFO.staticx=250;
PICINFO.staticy=350;//放到一个不可能的值上面
if(CurFile->F_Type==T_BMP) //得到BMP图片,改变显示屏的显示方向
{
LCD_WR_REG(0x0003,0x1090); //逐行扫描,x递增,y递减
Ramset(PICINFO.S_XOFF,319-(PICINFO.Div_Fac*PICINFO.ImgHeight+PICINFO.S_YOFF-1),PICINFO.Div_Fac*PICINFO.ImgWidth+PICINFO.S_XOFF-1,319-PICINFO.S_YOFF);
Lcd_WR_Start();
}
}
//判断这个像素是否可以显示
//(x,y) :像素原始坐标
//chg :功能变量.
//返回值:0,不需要显示.1,需要显示
u8 IsElementOk(u16 x,u16 y,u8 chg)
{
if(x!=PICINFO.staticx||y!=PICINFO.staticy)
{
if(chg==1)
{
PICINFO.staticx=x;
PICINFO.staticy=y;
}
return 1;
}
else return 0;
}
//智能画图
//FileName:要显示的图片文件 BMP/JPG/JPEG
//(sx,sy) :开始显示的坐标点
//(ex,ey) :结束显示的坐标点
//图片在开始和结束的坐标点范围内显示
BOOL AI_LoadPicFile(FileInfoStruct *FileName,u8 sx,u16 sy,u8 ex,u16 ey)
{
int funcret;//返回值
//得到显示方框大小
if(ey>sy)PICINFO.S_Height=ey-sy;
else PICINFO.S_Height=sy-ey;
if(ex>sx)PICINFO.S_Width=ex-sx;
else PICINFO.S_Width=sx-ex;
//显示区域无效
if(PICINFO.S_Height==0||PICINFO.S_Width==0)
{
PICINFO.S_Height=320;
PICINFO.S_Width=240;
return FALSE;
}
//影响速度
//SD_Init();//初始化SD卡,在意外拔出之后可以正常使用
//显示的开始坐标点
PICINFO.S_YOFF=sy;
PICINFO.S_XOFF=sx;
//文件名传递
CurFile=FileName;
if(CurFile->F_Type==T_BMP)//得到一个BMP图像
{
funcret=BmpDecode(CurFile); //得到一个BMP图像
LCD_WR_REG(0x0003,0x1030); //逐行扫描,x递增,y递增
Ramset(0,0,239,319); //恢复进入时的设置
Lcd_WR_Start();
return funcret;
}
else if(CurFile->F_Type==T_JPG||CurFile->F_Type==T_JPEG)//得到JPG/JPEG图片
{
//得到JPEG/JPG图片的开始信息
F_Open(CurFile);
//开始时读入1024个字节到缓存里面.方便后面提取JPEG解码的信息
F_Read(CurFile,jpg_buffer); //读第一次
F_Read(CurFile,jpg_buffer+512);//读第二次
InitTable(); //初始化各个数据表
if((funcret=InitTag())!=FUNC_OK)return FALSE;//初始化表头不成功
if((SampRate_Y_H==0)||(SampRate_Y_V==0))return FALSE ;//采样率错误
AI_Drow_Init(); //初始化PICINFO.Div_Fac,启动智能画图
funcret=Decode();//解码JPEG开始
}else return FALSE; //非图片格式!!!
if(funcret==FUNC_OK)return TRUE;//解码成功
else return FALSE; //解码失败
}
//解码这个BMP文件
//存在一点点小问题,就是第一个点不显示!!
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;
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 :
tmp_color = jpg_buffer[count] ;
break ;
case 1 :
color = jpg_buffer[count] ;
color<<=8 ;
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像素数数据后显示
{
x++;//x轴增加一个像素
if(x<=PICINFO.ImgWidth)
{
realx=x*PICINFO.Div_Fac;//x轴实际值
if(IsElementOk(realx,realy,1)&&yok&&realx)//符合条件
{
LCD_Write_Data(color);
}
没有合适的资源?快使用搜索试试~ 我知道了~
基于STM32的PDA
共237个文件
o:41个
d:40个
__i:40个
需积分: 8 9 下载量 196 浏览量
2012-01-08
14:16:12
上传
评论
收藏 4.63MB RAR 举报
温馨提示
基于STM32的PDA 基于STM32的PDA 基于STM32的PDA 基于STM32的PDA
资源推荐
资源详情
资源评论
收起资源包目录
基于STM32的PDA (237个子文件)
nrf24l01.__i 618B
ds18b20.__i 615B
jpegdecode.__i 608B
fm24c16.__i 606B
calendar.__i 606B
rgbledplay.__i 606B
ili9325.__i 606B
lcdhx8347.__i 605B
vs1003x.__i 605B
mp3player.__i 603B
mmc_sd.__i 601B
spi2.__i 600B
tran_pro.__i 598B
tran_mp3.__i 598B
tran_pic.__i 598B
rgbled.__i 597B
touch.__i 596B
red.__i 595B
setting.__i 595B
adc_dma.__i 595B
picture.__i 595B
untogb.__i 594B
myiic.__i 594B
led_pro.__i 594B
lrcpro.__i 591B
delay.__i 587B
ebook.__i 587B
spi.__i 586B
led.__i 585B
text.__i 583B
time.__i 583B
nvic.__i 580B
fat.__i 579B
gui.__i 579B
sys.__i 579B
main.__i 576B
alarm.__i 576B
vs1003.__i 570B
bmp.__i 568B
mp3.__i 548B
main.axf 294KB
main_uvopt.bak 81KB
main_uvproj.bak 19KB
main_sct.Bak 479B
jpegdecode.c 30KB
TOUCH.C 22KB
alarm.c 22KB
FAT.c 22KB
MMC_SD.C 21KB
ILI9325.c 17KB
mp3player.c 17KB
calendar.c 16KB
text.c 15KB
lrcpro.c 15KB
gui.c 15KB
rgbledplay.c 12KB
bmp.c 9KB
VS1003x.c 9KB
setting.c 7KB
tran_pro.c 6KB
SYS.C 5KB
red.c 4KB
ADC_DMA.c 4KB
time.c 4KB
picture.c 4KB
NVIC.C 3KB
DS18B20.C 3KB
SPI.C 3KB
tran_mp3.c 3KB
tran_pic.c 3KB
MYIIC.C 3KB
FM24C16.C 2KB
mp3.c 2KB
main.c 2KB
untogb.c 1KB
DELAY.C 1KB
ebook.c 1KB
led_pro.c 245B
jpegdecode.crf 203KB
lcdhx8347.crf 199KB
touch.crf 198KB
ili9325.crf 197KB
rgbledplay.crf 196KB
alarm.crf 196KB
tran_pro.crf 195KB
led.crf 193KB
tran_mp3.crf 193KB
tran_pic.crf 193KB
calendar.crf 193KB
rgbled.crf 193KB
lrcpro.crf 192KB
text.crf 192KB
led_pro.crf 192KB
mp3player.crf 192KB
gui.crf 192KB
vs1003x.crf 190KB
mp3.crf 190KB
time.crf 188KB
picture.crf 188KB
setting.crf 188KB
共 237 条
- 1
- 2
- 3
资源评论
holllo
- 粉丝: 0
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 冯璐阳 42105650—祝福.docx
- 基于多种算法及改进算法实现的移动机器人路径规划matlab源码(含A星算法+PRM+RRT的改进等).zip
- 布里斯托尔纸细分市场、总体规模、先进性、市占率行业分析报告2024年.docx
- Obi绳子插件,好用的很 6.5.4版本
- openjfx-22.0.1-windows-x64-bin-sdk.zip
- 基于ros和stm32f1的小车代码(含串口通信)+项目说明.zip
- 人体姿态估计-基于Tensorflow实现的人体姿态估计算法-附项目源码-优质项目分享.zip
- java实现所有算法大全
- JDBC DAO模式 (复习)
- Proteus仿真AT89C51电子密码锁
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功