1) bmp图片的特点 :没有压缩--》54字节头+像素颜色信息(BGR)。每个像素点占3字节
图片显示原理:图片是由一个个像素点组成的,每个像素点都有自己到颜色值,颜色值在计算机中采用RGB(红绿蓝三原色)表示
显示图像就是把图片中每个像素点填充到液晶屏对应的位置(位置不要错乱就行了)
液晶屏:每个像素点占4个字节,分别表ARGB的值, A表示透明度
2)具体实现思路
第一步:打开你要显示的800*480大小的bmp图片
open()
open("/dev/fb0")//打开开发板液晶屏的驱动
第二步:读取bmp图片的像素点的颜色值(颜色值大小如何计算)
char bmpbuf[800*480*3]
lseek(跳过起始位置的54字节)
read(bmpbuf) //800*480*3字节,从55字节开始读取
第三步:把读取的颜色值填充(写入)到开发板的液晶屏上
由于开发板的液晶屏每个像素点占4个字节,跟bmp图片像素点占用的字节数不匹配(顺序也不对)
思路:可以通过左移加位或运算拼接数据
write()
第四步:关闭图片和液晶屏
3)需要解决的问题
问题一:write显示bmp图片,效率低,显示速度慢,不流畅 --》内存映射mmap
问题二:任意位置显示任意大小的bmp图片 --》读bmp头部信息(54字节)获取宽、高
#include <stdio.h>#include <string.h>#include <sys/stat.h>#include <fcntl.h>#include <unistd.h>#include <sys/mman.h>//内存映射显示bmp图片,图片的起始位置(x,y)int show_bmp(char *bmp_name,int x,int y){int i,j;char A,R,G,B;//打开bmp图片int fd_bmp=open(bmp_name,O_RDWR);if(-1==fd_bmp){perror("open bmp failed!\n");return -1;}//读取bmp图片头部,获取宽度、高度char head[54]={0};//bmp图片头部54字节read(fd_bmp,head,54);int wid=head[21]<<24|head[20]<<16|head[19]<<8|head[18];//宽度int high=head[25]<<24|head[24]<<16|head[23]<<8|head[22];//高度int n=(4-wid*3%4)%4;//bmp字节对齐-》在每行的末尾填充n字节的垃圾信息//读取bmp图片数据char bmp[wid*3];//存一行数据(BGR)int bmp_buf[wid*high];//ARGBfor(i=0;i<high;i++){read(fd_bmp,bmp,wid*3);//读取一行for(j=0;j<wid;j++){A=0x00;//透明度B=bmp[j*3];G=bmp[j*3+1];R=bmp[j*3+2];//把3字节BGR的bmp格式==》4字节ARCB的bmp格式bmp_buf[i*wid+j]=A<<24|R<<16|G<<8|B;}lseek(fd_bmp,n,SEEK_CUR);//跳过每行末尾填充的冗余字节}//图片上下颠倒(垂直镜像)int bmp_temp[wid];//存一行数据(ARGB)for(i=0;i<high/2;i++){memcpy(bmp_temp,&bmp_buf[(high-1-i)*wid],wid*4);memcpy(&bmp_buf[(high-1-i)*wid],&bmp_buf[i*wid],wid*4);memcpy(&bmp_buf[i*wid],bmp_temp,wid*4);}//打开LCDint fd_lcd=open("/dev/fb0",O_RDWR);if(-1==fd_lcd){perror("open lcd failed!\n");return -1;}//打开内存映射int *lcd_map=mmap(NULL,800*480*4,PROT_WRITE,MAP_SHARED,fd_lcd,0);if(NULL==lcd_map){perror("mmap lcd failed\n");return -1;}//显示bmp图片:不显示宽超出800、高超出480的部分for(j=x;j<x+wid && j<800;j++){for(i=y;i<y+high && i<480;i++){lcd_map[i*800+j]=bmp_buf[(i-y)*wid+j-x];}}//关闭文件munmap(lcd_map,800*480*4);close(fd_bmp);close(fd_lcd);}int main(int argc,char **argv){show_bmp("1.bmp",0,0);sleep(2);show_bmp("2.bmp",600,300);return 0;}
如果觉得《在开发板显示24位的bmp格式图片》对你有帮助,请点赞、收藏,并留下你的观点哦!