文件IO(刷BMP格式图片、JPG格式图片)

这篇博客介绍了如何在Windows和Linux环境下处理BMP与JPG图片,包括显示BMP图片,计算BMP图片的宽度和高度,使用第三方库解压JPG图片,以及移植JPEG库到开发板。还提到了命名规范和Linux中一些实用小工具的安装。作业是实现4张照片的轮流播放,包括BMP和JPG格式。
摘要由CSDN通过智能技术生成

一、BMP图的实现

练习1:
再实现一张BMP图

 

	//打开lcd
	int lcd = open("/dev/fb0",O_RDWR);
	if(lcd < 0)
	{
		perror("open error!\n");
		return -1;
	}
	
	//lcd映射
	//指针指向一个像素点
	int *p = mmap(NULL,800*480*4,PROT_READ|PROT_WRITE,MAP_SHARED,lcd,0);
	if(p == NULL)
	{
		perror("mmap fail!\n");
		return -1;
	}	
	//打开bmp图片
	int lcd_bmp = open("1.bmp",O_RDWR);
	if(lcd_bmp < 0)
	{
		printf("open bmp fail!\n");
		return -1;
	}
	
	//去除掉头54个字节
	lseek(lcd_bmp,54,SEEK_SET);

	//存储bmp图片的buffer:800*480*3
	char buf[800*480*3] = {0};
	
	//读bmp图片
	read(lcd_bmp,buf,800*480*3);
	
	//将buf数据通过指针p填充到LCD中	
	// int i;
	// for(i=0;i<800*480;i++)
	// {
		// *(p+i) = buf[3*i] |buf[3*i+1]<<8 |buf[3*i+2]<<16;
	// }

	//将buf数据通过指针p填充到LCD中
	int x;//x表示横轴
	int y;//y表示纵轴
	for(y=0;y<480;y++)
	{
		for(x=0;x<800;x++)
		{
			/*
				将buf[]里面的数据由BGR换成RGB
				将3个字节封装成4个字节
			*/
			*(p+((479-y)*800+x)) = (buf[3*(y*800+x)+0]) | (buf[3*(y*800+x)+1]<<8) | (buf[3*(y*800+x)+2]<<16);
				/* 
			        0    =  buf[0] | buf[1]<<8 | buf[2]<<16
					1    =  buf[3] | buf[4]<<8 | buf[5]<<16
					2    =  buf[6] | buf[7]<<8 | buf[8]<<16
					800    =  buf[800*3] | buf[800*3+1]<<8 | buf[800*3+2]<<16
				 */	
		}
	}

	
	//lcd映射释放
	munmap(p,800*480*4);
	
	//关闭lcd\bmp
	close(lcd);
	close(lcd_bmp);

练习2:
实现3张照片的轮流播放
sleep(1);//延时1秒
usleep(1); //延时微秒
推展:能否将你实现bmp照片的代码封装成一个函数

int show_pic(int *p,char *bmp_path)
{
		//打开bmp图片
	int bmp = open(bmp_path,O_RDWR);
	if(bmp < 0)
	{
		printf("open bmp fail!\n");
		return -1;
	}
	
	//去除掉头54个字节
	lseek(bmp,54,SEEK_SET);
	
	//存储bmp图片的buffer:800*480*3
	char buf[800*480*3] = {0};

	int ret1 = read(bmp,buf,800*480*3);		
		sleep(1);
		//读bmp图片
		//将buf数据通过指针p填充到LCD中
		
	int x;//x表示横轴
	int y;//y表示纵轴
	for(y=0;y<480;y++)
	{
		for(x=0;x<800;x++)
		{
			/*
				将buf[]里面的数据由BGR换成RGB
				将3个字节封装成4个字节
			*/
			*(p+((479-y)*800+x)) = (buf[3*(y*800+x)+0]) | (buf[3*(y*800+x)+1]<<8) | (buf[3*(y*800+x)+2]<<16);
				/* 
					0    =  buf[0] | buf[1]<<8 | buf[2]<<16
					1    =  buf[3] | buf[4]<<8 | buf[5]<<16
					2    =  buf[6] | buf[7]<<8 | buf[8]<<16
					800    =  buf[800*3] | buf[800*3+1]<<8 | buf[800*3+2]<<16
				 */	
		}
	}
	close(bmp);
	
	return 0;
}


int main(int argc,char *argv[])
{
	//打开lcd
	int lcd = open("/dev/fb0",O_RDWR);
	if(lcd < 0)
	{
		perror("open lcd error!\n");
		return -1;
	}
	
	//lcd映射
	//指针指向一个像素点
	int *p = mmap(NULL,800*480*4,PROT_READ|PROT_WRITE,MAP_SHARED,lcd,0);
	if(p == NULL)
	{
		perror("mmap fail!\n");
		return -1;
	}
	
	//指针数组存储字符串
	char *bmp_path[] = {"1.bmp","zhao.bmp",
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值