定义了两个char型数组用于解决图片上下颠倒的问题,最终把
char buf2[800*480*4]写入LCD中,显示出来的图片除了底色和原图不同,
其他都一样,这是为什么?
开发板LCD大小800*480,原图24位位图BMP,底色纯白,大小也是800*480
LCD实际显示为底色暗黄的图片
int main()//版本2
{
int fd1=open("1.bmp",O_RDONLY);
if(fd1==-1)//暂时不考虑伪错误
{
perror("open() fd1 failded");
return -1;
}
int fd2=open("/dev/fb0",O_WRONLY);
if(fd2==-1)
{
perror("open() fd2 failded");
close(fd1);//要关闭前面打开的文件,避免资源泄露
return -1;
}
unsigned char buf1[800*480*3]={0};
unsigned char buf2[800*480*4]={0};
int offset=lseek(fd1,54,SEEK_SET);//文件位置移到第55个字节
if(offset==-1)
{
perror("lseek failded\n");
close(fd1);
close(fd2);
return -1;
}
int nread=read(fd1,buf1,800*480*3);
if(nread==-1)
{
perror("read() failded\n");
close(fd1);
close(fd2);
return -1;
}
int i,j;
for(j=0;j<480;++j)
{
for (i = 0; i <800 ; ++i)
{
buf2[800*4*j+4*i+1]=buf1[800*3*(479-j)+3*i+2];
buf2[800*4*j+4*i+2]=buf1[800*3*(479-j)+3*i+1];
buf2[800*4*j+4*i+3]=buf1[800*3*(479-j)+3*i];
}
}
int nwrite=write(fd2,buf2,800*480*4);
if(nwrite==-1||nwrite!=800*480*4)
{
perror("write() failded\n");
close(fd1);
close(fd2);
return -1;
}
close(fd1);
close(fd2);
return 0;
}
原图:
实际显示:
查找了网上的资料,说24位真色彩的bmp图片的54个字节以后都是颜色数据BGRA,我用unsigned char buf[800*480*4]应该是完整地拷贝了BMP的颜色数据啊
,为什么没有正确的显示。
亲,您好,我是CSDN必问的Q妹,你这个问题在必问区提问可能会更快速解决哦,邀您体验:https://biwen.csdn.net/
你可以下一个EasyX库,里面有加载图片和显示图片的函数
bmp图片是BGR排序,lcd是ARGB,bmp图片的前54字节是存储图片属性信息的,还有,bmp宽的取余要是4的倍数,否则填充了垃圾数,则需要进行位移。bmp图片显示在lcd上可以使用mmap函数进行内存映射,效率更高