OK6410 裸机BMP图片解码(一)

2014-11-24 09:10:15 · 作者: · 浏览: 3

主要在之前的解码的基础上面添加了图片缩放功能。


大家可以看看BMP解码过程或者思路。


资料网上非常多,在此就不在说明,直接上代码。


BMPdecode.c


/*************************************************************************************************************
* 文件名: bmpdecode.c
* 功能: BMP图片软件解码
* 作者: cp1300@139.com
* 创建时间: 2012年12月7日20:30
* 最后修改时间:2012年12月9日
* 详细: 只支持非压缩的BMP,16bit,24bit,32bit
* 图片文件最大由BMP_MAX_BUFF决定
* 因为使用了FATFS,以及比较多的临时变量,内联函数可能需要比较大的堆栈
* 因为添加了图片缩放功能,因此程序比以前的效率稍微低下了一点,主要是因为画点的时候需要判断了
*************************************************************************************************************/
#include "tft_lcd.h"
#include "system.h"
#include "bmpdecode.h"
#include "ff.h"


//图片缓冲区,目前定义为10MB,也就意味着最大只能打开10MB的位图文件
#define BMP_MAX_BUFF 10*1024*1024 //定义缓冲区最大大小
static u8 BmpImageBuff[BMP_MAX_BUFF]; //图片缓冲区
//显示窗口的最大值,一般定义为显示器大小
#define LCD_MAX_WIDTH 800 //最大宽度
#define LCD_MAX_HEIGHT 480 //最大高度


//图像数据压缩类型,目前只支持没有压缩的位图
#define BI_RGB 0 //没有压缩
#define BI_RLE8 1 //每个象素8比特的RLE压缩编码,压缩格式由2字节组成(重复象素计数和颜色索引)
#define BI_RLE4 2 //每个象素4比特的RLE压缩编码,压缩格式由2字节组成
#define BI_BITFIELDS 3 //每个象素的比特由指定的掩码决定


//16,24,32位BMP文件头部信息结构
typedef struct
{
u16 Invalid; //无效的填充字节,用于让数据对齐
u16 bfType ; //文件标志.只对'BM',用来识别BMP位图类型
u32 bfSize ; //文件大小,占四个字节
u32 bfReserved1 ; //保留
u32 bfOffBits ; //从文件开始到位图数据(bitmap data)开始之间的的偏移
u32 bmfHeaderSize; //图像描述信息块的大小,常为28H
u32 biWidth ; //说明图象的宽度,以象素为单位
u32 biHeight ; //说明图象的高度,以象素为单位
u16 biPlanes ; //为目标设备说明位面数,其值将总是被设为1
u16 biBitCount ; //说明比特数/象素,其值为1、4、8、16、24、或32
u32 biCompression ; //说明图象数据压缩的类型。其值可以是下述值之一:
//BI_RGB:没有压缩;
//BI_RLE8:每个象素8比特的RLE压缩编码,压缩格式由2字节组成(重复象素计数和颜色索引);
//BI_RLE4:每个象素4比特的RLE压缩编码,压缩格式由2字节组成
//BI_BITFIELDS:每个象素的比特由指定的掩码决定。
u32 biSizeImage ; //说明图象的大小,以字节为单位。当用BI_RGB格式时,可设置为0
u32 biXPelsPerMeter ;//说明水平分辨率,用象素/米表示
u32 biYPelsPerMeter ;//说明垂直分辨率,用象素/米表示
u32 biClrImportant ; //说明对图象显示有重要影响的颜色索引的数目,如果是0,表示都重要。
}BMPFILEHEADER;


//BMP图片相关的信息结构
struct BMP_IMAGE
{
u16 bfOffBits ; //从文件开始到位图数据(bitmap data)开始之间的的偏移
u16 biWidth ; //说明图象的宽度,以象素为单位
u16 biHeight ; //说明图象的高度,以象素为单位
u16 biBitCount ; //说明比特数/象素,其值为1、4、8、16、24、或32
u32 biSizeImage; //位图数据的大小
u32 biSizeFile; //位图文件大小
}BmpFile;


//图像信息
struct BMPPIC_POS
{
u32 ImgWidth; //图像的实际宽度和高度
u32 ImgHeight;

u32 Div_Fac; //图像缩放系数(扩大了10000倍)

u32 S_Height; //设定的显示高度和宽度
u32 S_Width;

u32 S_XOFFSET; //X,Y起始偏移量
u32 S_YOFFSET;

u32 staticx; //当前显示的X,Y坐标
u32 staticy;
}BMPPICINFO;



//内部函数声明
static BMP_ERROR OpenBmpFile(const char *FileName,u8 *buff,u32 FileMaxSize); //打开BMP图像,并将数据读取到内存
__inline u8 ReadByteData(u32 Offset); //读取一字节指定偏移的图片数据
static BMP_ERROR DecodingHead(u8 *FileBuff); //解码BMP图片头部
__inline void BmpImageDrow(u16 x,u16 y,u16 data); //BMP图像画点函数
static BMP_ERROR BmpDecode(u16 x1,u16 y1,u16 x2,u16 y2,u8 *BmpBuff); //BMP图像解码核心
static void ImageDrow_Init(void); //BMP画点函数初始化





/*******************************************************************************