嵌入式技术分享

Embedded Technology Sharing

关于QT5移植到嵌入式linux上颜色显示反色的处理方法

1.前言

最近在移植QT5到嵌入式linux开发板上时,发现屏幕显示的颜色与电脑端相反,具体表现为电脑红色,开发板显示蓝色,电脑蓝色,开发板红色。
经查明是由于开发板显示屏驱动fb默认参数为BGR模式显示,若要显示RGB需要修改代码。
网上一般的方法是修改显示屏驱动,但这样会引起不使用QT5时显示屏颜色异常。

1.1 正色RGB

《关于QT5移植到嵌入式linux上颜色显示反色的处理方法》

1.2 反色BGR

《关于QT5移植到嵌入式linux上颜色显示反色的处理方法》

2.处理方式

修改显示屏驱动的方式并不是特别稳妥,经过查阅显示屏驱动及QT代码,显示屏显示模式(RGB或BGR)是可以重新配置的,而QT显示屏初始化函数中,只从驱动中获取了默认的显示屏驱动参数,并未对显示屏(fb0)进行配置。导致不同的驱动,或不同的显示屏在颜色上会有反色的情况存在。

3.修改代码

在QT5.7源码中,找到qlinufbscreen.cpp文件,具体路径qtbase\src\plugins\platforms\linuxfb\qlinuxfbscreen.cpp ,修改QT源码是为了能在目前的开发板上显示正常,同时为了能兼容其他屏幕,增加了一个获取QT环境变量的参数判断。具体代码如下,在文件第371行插入:

    QByteArray env = qgetenv("QT_SUBPIXEL_AA_TYPE");
    if (env == "BGR"){
#if 0
        vinfo.bits_per_pixel   = 32;
        vinfo.red.length       = 8;
        vinfo.green.length     = 8;
        vinfo.blue.length      = 8;
        vinfo.transp.length    = 8;        
        vinfo.red.offset       = 16;
        vinfo.green.offset     = 8;
        vinfo.blue.offset      = 0;     
        vinfo.transp.offset    = 24;      
#else 
        vinfo.bits_per_pixel   = 24;
        vinfo.red.length       = 8;
        vinfo.green.length     = 8;
        vinfo.blue.length      = 8;
//      vinfo.transp.length    = 0;      
        vinfo.red.offset       = 0;
        vinfo.green.offset     = 8;
        vinfo.blue.offset      = 16;
//      vinfo.transp.offset    = 0;        
#endif

        if (ioctl(mFbFd, FBIOPUT_VSCREENINFO, &vinfo)) {
            qErrnoWarning(errno, "Unable to set double buffer mode!");
            return false;
        }

在开发板启动时的profile文件中,加入:

#export QT_SUBPIXEL_AA_TYPE=RGB
export QT_SUBPIXEL_AA_TYPE=BGR

这样对源码和启动文件进行修改后,当显示屏颜色表现为反色时(与电脑颜色相反)就配置 QT_SUBPIXEL_AA_TYPE 为 BGR ,与电脑颜色相同,配置成RGB或不配置,则可以使用默认的RGB模式。

4.结束语

以上就是自己遇到的QT5移植到嵌入式开发板时,显示屏显示反色时的处理方式,修改QT源码而非修改驱动代码,同时加入环境变量参数判断,可以更好兼容其他屏幕。
当然这只是处理反色的一种思路,并不一定每种开发板都适用。具体需要看显示屏的驱动源码,如讯为的4412开发板fb0显示屏驱动,若应用层初始化参数错误或者不完整,会直接使用默认的参数。使用本文所用的方式则达不到应有的效果,只能修改显示屏fb0驱动源码。

如果文章对您有帮助,欢迎移至上方按钮打赏博主;

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注