在linux字符界面用mmap()函数实现bmp图片的快速刷新

编程思路:
1、打开bmp图片获得fd文件描述符(open()函数)
2、偏移信息头54字节,lseek()函数
3、读取bmp图片BGR(与RGB位置相反)信息
4、关闭文件fd

5、打开屏幕设备文件/dev/fb0(open(),读写操作)
6、映射一块内存地址
7、BGR转ARGB,3转4操作,上下颠倒操作
8、将ARGB显示数据写到fb0 注意:ubantu字符界面可视分辨率800600,实际分辨率不是800600,要进行偏移
9、关闭屏幕

图片解释:
在linux字符界面用mmap()函数实现bmp图片的快速刷新_第1张图片

在linux字符界面用mmap()函数实现bmp图片的快速刷新_第2张图片
在linux字符界面用mmap()函数实现bmp图片的快速刷新_第3张图片
在linux字符界面用mmap()函数实现bmp图片的快速刷新_第4张图片
实现代码:

#include 
#include 
#include 
#include 
#include 
#include 
#include 
int main(int argv,char *argc[])
{
	unsigned char bmp_buf[480][800*3]={0};
	int lcd_buf[480][800]={0};
	/* 1、open bmp to get fd. */
	int bmp_fd = open(argc[1],O_RDONLY);
	/* 2、jump bmp head info size of 54 Bytes. */
	lseek(bmp_fd,54,SEEK_SET);
	/* 3、read bmp RGB info to bmp_buf and print read_numBytes. */
	read(bmp_fd,bmp_buf,800*480*3);
	/* 4、close bmp_fd */
	close(bmp_fd);

	/* 5、open screen file. */
	int fb0_fd = open("/dev/fb0",O_RDWR);
	
	// 6、映射
	unsigned int *p = mmap(NULL,                   //映射的首地址
		                   1176*885*4,             //映射的空间大小,也就是开发板显存
		                   PROT_READ|PROT_WRITE,   //允许进行读写操作
		                   MAP_SHARED,             //内存共享
		                   fb0_fd,                 //打开屏幕设备返回的文件描述符
		                   0);                     //偏移地址
	if (p == MAP_FAILED) {
		printf("mmap failed!\n");
		return -3;
	}
	/* 7、BGR转ARGB,3转4操作,上下颠倒操作 */
	for(int Bmp_H=0;Bmp_H<480;Bmp_H++)
		for (int Bmp_W = 0; Bmp_W<800; Bmp_W++)
			lcd_buf[479-Bmp_H][Bmp_W]=(0x00<<24) | (bmp_buf[Bmp_H][Bmp_W*3]) | (bmp_buf[Bmp_H][Bmp_W*3+1]<<8) | (bmp_buf[Bmp_H][Bmp_W*3+2]<<16);
	//* 8、write ARGB info to fb0_fd.*/
	for(int x=0;x<480;x++) 
		for(int y=0;y<800;y++)
			*(p+x*1176+y) = lcd_buf[x][y];  //把最后一行放到第一行 

	// 9、解除映射并关闭屏幕文件
	munmap(p,800*480*4);
	/*close fd. */
	close(fb0_fd);
}

ctrl+alt+F1,输入用户名加密码(不显示)进入字符界面,输入以下执行命令:
执行命令:sudo ./程序名 路径
例子:sudo ./shoubmp 1.bmp
运行结果:
在linux字符界面用mmap()函数实现bmp图片的快速刷新_第5张图片
————————————————

你可能感兴趣的:(Linux)