关于Linux4412开发平台上Qt程序的反色问题

Linux4412开发板颜色问题

         最近在做一个基于Linux4412平台的资产管理软件的界面,当我的Qt界面程序在开发板上运行的时候,logo的颜色瞬间改变,而我的Qt界面的颜色也改变了,具体情况是,红色变成了蓝色,蓝色变成了红色,而绿色是正常显示的,找了好久都没有找到解决的方法。

         在Linux开发板开机启动的时候,logo显示是正常的,所以Linux上应该是正常的,而我的Qt程序在宿主机上运行是也是正常的,所以也不会是我Qt程序的问题,那么问题出在哪儿呢?

         和我的同事讨论后,觉得有可能是Linux开发板上的流lcd驱动的问题,因为在开发板运行我的程序的时候,颜色恰好是相反的,也就说,可能是我的Qt程序中使用RGB顺序和开发板上的RGB顺序是相反的,于是开始查看开发板上的lcd驱动程序,果然发现了问题。

         刚开始,我读取了开发板的LCD的显示参数,主要是其中的可变参数fb_var_screeninfo这个结构体,其中有六个变量是与这个问题有关的,在fb_var_screeninfo结构体中有三个结构体成员,是由同一个结构体来定义的,该结构体就是struct fb_bitfield,这个结构体大致如下:

Sturct fb_bitfield

{

         _u32offset;//颜色的偏移量

         _u32length;//表示颜色的长度

         _u32msb_right;//

}

从以上信息可以看到颜色的偏移量和长度,颜色的长度决定了屏幕的颜色深度,二偏移量就决定了颜色的顺序。

         在struct  fb_var_screeninfo中有如下的变量

Struct fb_var_screeninfo

{
……

         Structfb_bitfield red;

         Structfb_bitfield green;

         Structfb_bitfield blue;

……

}

         到这里我们不难看出LCD中是怎么来表示颜色的了吧,当我首次从程序读出以上数据的时候,数据是这样的:

Red.offset = 16

Red.length = 8

Green.offset = 8

Green.legnth = 8

Blue.offset = 0

Blue.length = 8;

可以看出,这样一个顺序是蓝色在前,红色在最后,所以此时颜色的顺序是BGR而不是我们的RGB,所以这就是问题的所在。

 

那么接下来就来看看怎么矫正:

字开发板的内核文件下找到这样一个文件./drivers/video/lcd.c,这个文件就是lcd驱动源程序,有关LCD显示的参数的设置都在这里面,大约是在521行(不同的内核可能不一样),有这样一顿程序:

……

Case32:

Case24:

         bit_per_pixel= 32;

         red.offset    =16;

         red.length        =8;

         green.offset     =8;

         green.length    =8;

         blue.offset        =0;

         blue.length       =8;

……

所以,我们只需要将red和blue的offset值对调,重新编译内核,烧写内核即可。

但是这里还有点问题我不太明白,希望懂得的人帮忙讲解一下

1、  我这屏幕的颜色深度是32位的,但是在以上程序中为什么是24的时候设置?

2、  这样修改之后,我的程序运行起来效果对了,但是logo的颜色却和以前相反了,有没有能够在启动程序的时候往里面写入颜色的偏移量,在程序退出的时候讲其偏移量改回的方法?


本人是新手,废话有点多,对Linux的内核不是很熟悉,这次只是解决问题的心得,希望能够帮到遇到同样问题的朋友,请多指教,谢谢

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值