24位bmp图片的显示(基于A58系列开发板)

24位bmp图片的显示

之前在使用a58系列的开发板时做过bmp图片的显示,博主在这里想将其记录下来。
在图像显示中
常见的图像格式:bmp jpg png
博主在这里分享的是bmp图片的显示
首先,我们得了解他的编码特点

bmp图片编码的特点:
1.每个像素点占3个字节,分别存储的是RGB(红绿蓝三原色)的数值
2. bmp是微软公司发明的一种图片格式,在存储的时候RGB就是颠倒
3. bmp图片在存储的时候,上下也是颠倒
4.bmp图片有54字节的头信息
5.但是lcd要求每个像素点占4个字节,多出来的一个字节用于存放图片的透明度信息(A),换句话来说,lcd上要求是ARGB,而图片是RGB

显示bmp图片思路:
1.打开bmp图片
2.打开lcd
3.读取bmp图片像素点的RGB值
4.将读取的颜色值写入到lcd中
5.关闭

下面是博主自己封装的一个显示函数

```c
//x和y:你定义的显示图片的位置的横坐标和纵坐标
//w和h:你要显示图片的长和宽
//bmppath:图片的路径
int show_anybmp(int x,int y,int w,int h,char *bmppath)
{
	//定义bmp图片的文件描述符
	int fd1;
	//定义lcd驱动的文件描述符
	int fd2;
	//用int类型的数组存放ARGB
	int lcdbuf[w*h];
	//定义一个int类型的指针在显存中的首地址
	int *lcdmem;
	int i;
	int j;
	//定义数组存放像素点的RGB
	char bmpbuf[w*h*3];
	//打开要显示的bmp图片
	fd1 = open(bmppath,O_RDWR);
	if(fd1==-1)
	{
		perror("打开图片");
		return -1;
	}
	//打开lcd驱动
	fd2 = open("/dev/fb0",O_RDWR);  //这个驱动路径不同开发板路径可能不同
	if(fd2==-1)
	{
		perror("打开lcd驱动");
		return -1;
	}
	//映射得到lcd在显存中的首地址
	lcdmem = mmap(NULL,800*480*4,PROT_WRITE|PROT_READ,MAP_SHARED,fd2,0);
	if(lcdmem==NULL)
	{
		perror("映射");
		return -1;
	}
	//在读取文件之前,往后移动54字节(图片的头信息),从第55字节开始读取
	lseek(fd1,54,SEEK_SET);

	//判断w(是否能够被4整除)
	w = w*3;
	while(w%4!=0)
	{
		w++;
	}
	w = w/3;
	
	//读取bmp图片的像素点颜色值
	read(fd1,bmpbuf,w*h*3);
	//将3位RGB -->4位ARGB
	//位运算加左移
	for(i=0;i

转载请声明出处:https://blog.csdn.net/xl575864781/article/details/104850057

你可能感兴趣的:(24位bmp图片的显示(基于A58系列开发板))