bmp图片在arm开发板显示

//复合数据类型的设计  结构体数据类型  枚举数据类型
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;
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值