OK6410 裸机BMP图片解码(四)

2014-11-24 09:10:15 · 作者: · 浏览: 5
age = pbmp->biSizeImage;//位图的数据大小,有的图片这个值为0
/****************************************************/
//调试
uart_printf("地址偏移:%d\r\n",BmpFile.bfOffBits);
uart_printf("颜色深度:%d\r\n",BmpFile.biBitCount);
uart_printf("水平分辨率:%d\r\n",BmpFile.biWidth);
uart_printf("垂直分辨率:%d\r\n",BmpFile.biHeight);
uart_printf("数据大小:%d\r\n",BmpFile.biSizeImage);
uart_printf("位图标志:%X\r\n",pbmp->bfType);
/****************************************************/
if(pbmp->bfType == 0x4d42) //检测位图头部信息
{
if((BmpFile.biBitCount != 16) && (BmpFile.biBitCount != 24) && (BmpFile.biBitCount != 32))
error = BMP_TYPE_ERROR;
else
error = BMP_OK;
}
else
error = BMP_TYPE_ERROR;

return error;
}



/*************************************************************************************************************************
*函数 : __inline void BmpImageDrow(u16 x,u16 y,u16 data)
*功能 : BMP图像画点函数
*参数 : x,y:xy坐标,data:RGB565数据
*返回 : 无
*依赖 : 无
*作者 : cp1300@139.com
*时间 : 20121207
*最后修改时间 : 20121207
*说明 : 因为进行缩放的时候,有些点不用进行显示
*************************************************************************************************************************/
__inline void BmpImageDrow(u16 x,u16 y,u16 data)
{
if(x != BMPPICINFO.staticx || y != BMPPICINFO.staticy)
{
BMPPICINFO.staticx = x;
BMPPICINFO.staticy = y;
LCD_DrawPoint(x+BMPPICINFO.S_XOFFSET,y+BMPPICINFO.S_YOFFSET,data);
}
}



/*************************************************************************************************************************
*函数 : static BMP_ERROR BmpDecode(u16 x1,u16 y1,u16 x2,u16 y2,u8 *BmpBuff)
*功能 : BMP图像解码核心
*参数 : x1,y1:窗口起始坐标;x2,y2:窗口结束坐标;BmpBuff:图像缓冲区指针
*返回 : BMP_ERROR
*依赖 : 需要先解码头信息
*作者 : cp1300@139.com
*时间 : 20121207
*最后修改时间 : 20121209
*说明 : 解码图像
*************************************************************************************************************************/
static BMP_ERROR BmpDecode(u16 x1,u16 y1,u16 x2,u16 y2,u8 *BmpBuff)
{
BMP_ERROR error = BMP_OK;

u32 data; //存放24BIT图片的一个像素颜色值
u32 bmp_cnt; //已经读取的照片数据计数

u16 uiTemp; //x轴方向实际存储的像素数据字节数
u16 xValid; //x轴方向有效的像素数据字节数
u16 xcnt; //X轴方向像素点数据字节数计数
u16 x,y; //画点坐标
u8 temp;

if((BmpFile.biWidth * BmpFile.biBitCount / 8) % 4)//水平像素字节数不是4的整数倍
uiTemp = ((BmpFile.biWidth * BmpFile.biBitCount / 8) / 4 + 1) * 4;//将水平像素字节数扩展成4的整数倍
else
uiTemp = BmpFile.biWidth * BmpFile.biBitCount / 8;
xValid = BmpFile.biWidth * (BmpFile.biBitCount / 8); //计算水平有效地数据字节数
y = BMPPICINFO.ImgHeight - 1; //BMP图片由左下角到右上角刷新,因此起点y坐标要加上图片的高度
x = 0;
bmp_cnt = BmpFile.bfOffBits;//将文件数据开始赋值给数据计数器
xcnt = 0; //X方向像素点计数器清零
do
{
switch (BmpFile.biBitCount)//判断图片颜色深度
{
case 32: //32BIT ARGB8888 //之所以使用一个字节读取一方面方便移植到内存较小的单片机上面执行,另一方面避免内存非对齐访问产生异常。
{
data = ReadByteData(bmp_cnt++);
temp = ReadByteData(bmp_cnt++);
data |= temp << 8;
temp = ReadByteData(bmp_cnt++);
data |= temp << 16;
bmp_cnt ++;
data = RGB565(data); //RGB888 ---> RGB565
}break;
case 24: //24BIT RGB888 //可能存在4字节对齐问题
{
data = Re