金牌会员
 
- 积分
- 1553
- 金钱
- 1553
- 注册时间
- 2016-11-21
- 在线时间
- 411 小时
|
发表于 2018-1-5 19:46:57
|
显示全部楼层
typedef struct
{
char cfType[2]; /* 文件类型, 必须为 "BM" (0x4D42)*/
char cfSize[4]; /* 文件的大小(字节) */
char cfReserved[4]; /* 保留, 必须为 0 */
char cfoffBits[4]; /* 位图阵列相对于文件头的偏移量(字节)*/
}__attribute__((packed)) BITMAPFILEHEADER;
/* 位图信息头结构40byte */
typedef struct
{
char ciSize[4]; /* size of BITMAPINFOHEADER */
char ciWidth[4]; /* 位图宽度(像素) */
char ciHeight[4]; /* 位图高度(像素) */
char ciPlanes[2]; /* 目标设备的位平面数, 必须置为1 */
char ciBitCount[2]; /* 每个像素的位数, 1,4,8或24 */
char ciCompress[4]; /* 位图阵列的压缩方法,0=不压缩 */
char ciSizeImage[4]; /* 图像大小(字节) */
char ciXPelsPerMeter[4];/* 目标设备水平每米像素个数 */
char ciYPelsPerMeter[4];/* 目标设备垂直每米像素个数 */
char ciClrUsed[4]; /* 位图实际使用的颜色表的颜色数 */
char ciClrImportant[4]; /* 重要颜色索引的个数 */
}__attribute__((packed)) BITMAPINFOHEADER;
typedef struct PIXINFO
{
u8 r;
u8 g;
u8 b;
}PIX;
BITMAPFILEHEADER FileHead;
BITMAPINFOHEADER InfoHead;
FIL myfp;
FIL myfp;
signed char Get_Icon(char *bmpfile ,u32 addr)
{
PIX pix;
int ciBitCount,ciWidth,ciHeight;
u8 lcdcolor[4];
u16 dispcolor=0;
u8 buf[256];
u16 bnum=0;
u16 i=0,j=0;
u32 offset=0;
/* (1)打开位图文件 */
myres=f_open(&myfp,bmpfile,FA_OPEN_EXISTING|FA_READ); //以二进制的只读方式打开文件
if (myres != FR_OK)
{
return -1;
}
/*(2) 读取位图文件头 */
myres=f_read(&myfp,&FileHead,sizeof(BITMAPFILEHEADER),&mybw);
if ( myres != FR_OK)
{
f_close(&myfp);
return -2;
}
/*(3) 判断位图的类型 */
if (memcmp(FileHead.cfType, "BM", 2) != 0) //内存对比
{
f_close(&myfp);
return -3;
}
/* (4)读取位图信息头 */
myres=f_read(&myfp,(char *)&InfoHead,sizeof(BITMAPINFOHEADER),&mybw);
if ( myres != FR_OK)
{
f_close(&myfp);
return -4;
}
ciBitCount = (int) chartolong( InfoHead.ciBitCount, 4 );//获得图片色深
ciWidth = (int) chartolong( InfoHead.ciWidth , 4 );
ciHeight = (int) chartolong( InfoHead.ciHeight, 4 );
/*(5)将文件光标移动到文件的数据区 */
for(bnum=0;bnum<(ciWidth*ciHeight*2+4095)/4096;bnum++)
{
W25QXX_EraseSector(addr+bnum*4096);
}
bnum=0;
offset=(int)chartolong(FileHead.cfoffBits,4);
for(j=0;j<ciHeight;j++)
{
f_lseek(&myfp,offset+(ciHeight-j-1)*ciWidth*ciBitCount/8);
for(i=0;i<ciWidth;i++)
{
myres=f_read(&myfp,(char *)&lcdcolor,ciBitCount/8,&mybw);
if(ciBitCount==32||ciBitCount==24)
{
pix.r=lcdcolor[2]>>3;
pix.g=lcdcolor[1]>>2;
pix.b=lcdcolor[0]>>3;
}
else if(ciBitCount==16)
{
dispcolor=(lcdcolor[0]<<0)|(lcdcolor[1]<<8); //1111 1111 1111 1111
if((int)chartolong(InfoHead.ciCompress,4)==0) //RGB555
{
pix.r=((dispcolor&0x7C00)>>10);
pix.g=(((dispcolor&0x03E0)<<1)>>5); // RGB555 扩展成RGB565 G=G*64/32
pix.b=(dispcolor&0x1F);
}
else //RGB565
{
pix.r=((dispcolor&0xF800)>>11);
pix.g=(((dispcolor&0x07E0))>>5); // RGB555 扩展成RGB565 G=G*64/32
pix.b=(dispcolor&0x1F);
}
}
dispcolor=((pix.r)<<11)|((pix.g)<<5)|(pix.b);
// GUI_DrawPixel(i,j,dispcolor);
buf[bnum++]=(u8)(dispcolor>>8);
buf[bnum++]=(u8)(dispcolor&0xFF);
if(bnum==256)
{
W25QXX_WritePage(buf,addr,256);
addr+=256;
bnum=0;
}
}
}
W25QXX_WritePage(buf,addr,bnum);
addr+=bnum;
f_close(&myfp);
return( 0 );
}
参考这个程序咯 |
|