使用文件IO在开发板的LCD上显示24位BMP图片的问题

定义了两个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函数进行内存映射,效率更高