//复合数据类型的设计 结构体数据类型 枚举数据类型
typedef unsigned short UINT;
typedef unsigned int DWORD;
typedef unsigned short WORD;
typedef unsigned int LONG;
typedef struct tagBITMAPFILEHEADER { /* bmp文件头结构体 14 */
UINT bfType;//2
DWORD bfSize;//4
UINT bfReserved1;
UINT bfReserved2;
DWORD bfOffBits;
} BITMAPFILEHEADER;
typedef struct tagBITMAPINFOHEADER { /* bmih 位图信息头结构体 40个字节*/
DWORD biSize;//4
LONG biWidth; //图片的宽度
LONG biHeight;//图片的高度
WORD biPlanes;//2
WORD biBitCount;
DWORD biCompression;
DWORD biSizeImage; //图片的大小
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
}BITMAPINFOHEADER;
//显示图片
int show_bmp(char *fileName)
{
//1、打开液晶屏文件
int lcdfd = open("/dev/fb0",O_RDWR);
if(lcdfd == -1){
perror("open lcd error");
return -1;
}
//内存映射
int *lcd_p=mmap(NULL,480*800*4,PROT_READ|PROT_WRITE,MAP_SHARED,lcdfd,0);
if(lcd_p== MAP_FAILED)
{
perror("lcd mmap error");
return -1;
}
char bmpbuf[800*480*3];//存储图片的数据
int tempbuf[800*480];//存储转换颜色顺序之后的数据
//2、打开图片文件
int bmpfd = open(fileName,O_RDWR);
if(bmpfd == -1){
perror("open bmpfd error");
return -1;
}
//在读取位图颜色数据之前,把前面54个字节的文件头+位图信息头跳过
//lseek(bmpfd,54,SEEK_SET);
//读取前面14个字节的文件头数据
BITMAPFILEHEADER fileHeader;
read(bmpfd,&fileHeader,14);
//读取中间40个字节的位图信息头数据
BITMAPINFOHEADER infoheader;
read(bmpfd,&infoheader,40);
//3、读取图片的数据 bmpbuf
read(bmpfd,bmpbuf,800*480*3);
//将图片数据每个像素点BGR转换成 ARGB
for(int i=0,j=0; i<800*480; i++,j+=3)
{
tempbuf[i] = 0x00<<24|bmpbuf[j+2]<<16|bmpbuf[j+1]<<8|bmpbuf[j];
}
//还要将图片的数据上下180度颠倒
int flipbuf[800*480];//存储翻转之后的数据
for(int j=0; j<480; j++)
{
for(int i=0; i<800 ;i++)
{
flipbuf[j*800+i] = tempbuf[(479-j)*800+i];
}
}
//从右边开始慢慢显示一张图片
for(int j=799; j>=0; j--)
{
for(int i=0; i<480 ;i++)
{
lcd_p[i*800+j] = flipbuf[i*800+j];
}
usleep(500);
}
//5、关闭液晶屏文件、关闭图片文件
close(bmpfd);
close(lcdfd);
munmap(lcd_p,480*800*4);
return 0;
}
bmp图片在arm开发板显示
于 2022-06-22 14:27:49 首次发布