2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > 在开发板显示24位的bmp格式图片

在开发板显示24位的bmp格式图片

时间:2021-03-19 11:51:53

相关推荐

在开发板显示24位的bmp格式图片

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;}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。