OK6410 裸机BMP图片解码(二)

2014-11-24 09:10:15 · 作者: · 浏览: 2
******************************************
*函数 : static BMP_ERROR OpenBmpFile(const char *FileName,u8 *buff,u32 FileMaxSize)
*功能 : 打开BMP图像,并将数据读取到内存
*参数 : FileName:文件名,路径指针;buff:读取缓冲区;FileMaxSize:文件最大限制
*返回 : BMP_ERROR
*依赖 : FATFS文件系统支持
*作者 : cp1300@139.com
*时间 : 20121207
*最后修改时间 : 20121207
*说明 : 调用FATFS打开BMP图片文件
*************************************************************************************************************************/
static BMP_ERROR OpenBmpFile(const char *FileName,u8 *buff,u32 FileMaxSize)
{
FIL file;
UINT cnt;
int status;
BMP_ERROR error = BMP_OK;

status = f_open(&file,FileName,FA_READ); //只读方式打开文件
if(status != FR_OK) //打开文件错误
{
uart_printf("open \"%s\" error!\r\n",FileName);
status = BMP_OPEN_ERROR;
}
else
{
//获取文件大小
uart_printf("file size : %dB\r\n",file.fsize); //输出文件大小
if(file.fsize > FileMaxSize)
{
uart_printf("file size > %d\r\n",FileMaxSize);
status = BMP_SIZE_ERROR;

}
else
{
status = f_read(&file,buff,file.fsize,&cnt); //读取文件
uart_printf("Read File Num=%d\r\n",cnt);
if(cnt == file.fsize) //判断文件是否读取完毕
{
uart_printf("read file end!\r\n");
BmpFile.biSizeFile = file.fsize; //存储位图文件大小
status = BMP_OK;
}
else
{
uart_printf("read file error!\r\n");
status = BMP_READ_ERROR;
}
}
}
f_close(&file);
return error;
}


/*************************************************************************************************************************
*函数 : __inline u8 ReadByteData(u32 Offset)
*功能 : 读取一字节指定偏移的图片数据
*参数 : Offset:地址偏移
*返回 : 数据
*依赖 : 无
*作者 : cp1300@139.com
*时间 : 20121207
*最后修改时间 : 20121207
*说明 : 方便移植
*************************************************************************************************************************/
__inline u8 ReadByteData(u32 Offset)
{
return BmpImageBuff[Offset];
}




/*************************************************************************************************************************
*函数 : static BMP_ERROR DecodingHead(u8 *FileBuff)
*功能 : 解码BMP图片头部
*参数 : *FileBuff:bmp图像数据缓冲区指针
*返回 : BMP_ERROR
*依赖 : static BMP_ERROR OpenBmpFile(const char *FileName,u8 *buff,u32 FileMaxSize)
*作者 : cp1300@139.com
*时间 : 20121207
*最后修改时间 : 20121207
*说明 : 注意BMP的头部信息并没有按照32BIT对齐,在前面插了两个字节后即可对齐,非对齐访问会发生异常
*************************************************************************************************************************/
static BMP_ERROR DecodingHead(u8 *FileBuff)
{
BMP_ERROR error = BMP_OK;
u8 buff[52];
u8 cnt;
BMPFILEHEADER *pbmp;//临时指针,用于获取BMP文件的头部信息
u8 *p = buff + 2; //BMP头部共50字节,前面的两个字节用于偏移对齐

for(cnt = 0;cnt < 50;cnt ++)
{
p[cnt] = FileBuff[cnt]; //复制(读取)头部到缓冲区
}
pbmp = (BMPFILEHEADER*)buff; //得到BMP的头部信息
BmpFile.bfOffBits = pbmp->bfOffBits; //位图数据偏移地址偏移
BmpFile.biBitCount = pbmp->biBitCount; //位图数据的颜色深度只支持16bit,24bit,32bit
BmpFile.biWidth = pbmp->biWidth; //位图的水平像素数
BmpFile.biHeight = pbmp->biHeight; //位图的垂直像素数
BmpFile.biSizeIm