temp = ReadByteData(bmp_cnt++);
data |= temp << 8;
temp = ReadByteData(bmp_cnt++);
data |= temp << 16;
xcnt += 3;
data = RGB565(data); //RGB888 ---> RGB565
}break;
case 16: //16BIT RGB555 //可能存在4字节对齐问题
{
data = ReadByteData(bmp_cnt++);
temp = ReadByteData(bmp_cnt++);
data |= temp << 8;
xcnt += 2;
data = ((data & 0xffe0) << 1) | (data & 0x001f);//RGB555 ---> RGB565
data |= ((data & BIT6) BIT5 : 0);
};break;
default : break;//只支持16BIT,24BIT,32BIT图片的解码
}
switch(BMPPICINFO.Div_Fac)
{
case 10000 : BmpImageDrow(x,y,data);break; //图片无需缩放
default : BmpImageDrow(x*BMPPICINFO.Div_Fac/10000,y*BMPPICINFO.Div_Fac/10000,data);break; //图片需要缩放
}
x ++;
if(x == BMPPICINFO.ImgWidth) //一行解码完成,换行
{
x = 0;
if(y == 0) break;
y --;
}
if(xcnt == xValid) //插值,无效数据,跳过
{
bmp_cnt += uiTemp - xcnt;
xcnt = 0;
}
}while(bmp_cnt < BmpFile.biSizeFile); //判断数据是否读取完毕
uart_printf("bmp_cnt = 0x%X; BmpFile.biSizeFile = 0x%X\r\n",bmp_cnt,BmpFile.biSizeFile);
return error;
}
/*************************************************************************************************************************
*函数 : static void ImageDrow_Init(void)
*参数 : 无
*返回 : 无
*依赖 : 无
*作者 : cp1300@139.com
*时间 : 20121207
*最后修改时间 : 20121209
*说明 : 用于计算显示坐标以及缩放系数
*************************************************************************************************************************/
static void ImageDrow_Init(void)
{
float temp,temp1;
BMPPICINFO.ImgWidth = BmpFile.biWidth; //获取图像实际宽度
BMPPICINFO.ImgHeight = BmpFile.biHeight; //获取图像实际高度
temp=(float)BMPPICINFO.S_Width / BMPPICINFO.ImgWidth;
temp1=(float)BMPPICINFO.S_Height / BMPPICINFO.ImgHeight;
if(temp < temp1) temp1 = temp; //取较小的那个边的缩放系数
if(temp1 > 1) temp1 = 1; //不能放大,原图大小显示
BMPPICINFO.Div_Fac = temp1 * 10000; //将缩放系数扩大10000倍
//计算偏移,将图片置于显示区域的起始位置
BMPPICINFO.S_XOFFSET += (BMPPICINFO.S_Width - temp1 * BMPPICINFO.ImgWidth) / 2;
BMPPICINFO.S_YOFFSET += (BMPPICINFO.S_Height - temp1 * BMPPICINFO.ImgHeight) / 2;
//将当前显示坐标放到一个不可能的值上面
BMPPICINFO.staticx = 0xffff;
BMPPICINFO.staticy = 0xffff;
}
/*************************************************************************************************************************
*函数 : BMP_ERROR ShowBmpImage(u16 x1,u16 y1,u16 x2,u16 y2,const char *BmpFile)
*功能 : 指定位置显示一张BMP图片
*参数 : x1,y1:窗口起始坐标;x2,y2:窗口结束坐标;BmpFile:BMP文件路径以及名称
*返回 : BMP_ERROR
*依赖 : static BMP_ERROR BmpDecode(u16 x1,u16 y1,u16 x2,u16 y2,u8 *BmpBuff)
*作者 : cp1300@139.com
*时间 : 20121207
*最后修改时间 : 20121207
*说明 : 直接在LCD上面显示一张BMP图片,需要FATFS支持
* 当结束窗口坐标为0的时候结束坐标自动换成屏幕结束坐标
*************************************************************************************************************************/
BMP_ERROR ShowBmpImage(u16 x1,u16 y1,u16 x2,u16 y2,const char *BmpFile)
{
BMP_ERROR error;
BMPPICINFO.S_Width = (((x2 - x1 + 1) > LCD_MAX_WIDTH) || (x2 == 0)) (LCD_MAX_WIDTH-x1): (x2 - x1 + 1); //计算设定的显示宽度和高度
BMPPICINFO.S_Height = (((y2 - y1 + 1) > LCD_MAX_HEIGHT) || (y2 == 0)) (LCD_MAX_