NEWS

新闻

了解openKylin最新资讯,关注社区和产品动态。

NEWS

Learn about the latest news.

【小白课程】openKylin护眼模式功能和实现原理介绍

2024-03-12 09:20:30

1. 背景介绍


科学研究揭示,在白天,蓝光可以增强我们的注意力、反应力和情绪,并对自然的睡眠规律起重要作用。然而,在晚上,蓝光中的高能量具有较强的穿透能力,能直接触及视网膜。若长期置身于高强度蓝光的照射下,视网膜细胞可能会受到损伤,同时,它还可能干扰人体内部的生物钟,导致睡眠质量的下降。

在openKylin开源操作系统中,贴心地为用户提供了护眼模式,旨在通过调整屏幕色温与亮度,降低对用户视力的潜在危害。同时,它允许用户根据个人偏好和周围环境的需求,灵活调整屏幕显示效果,有效屏蔽高能蓝光,从而减轻视觉疲劳,提升用眼舒适度。


2.如何启动并设置护眼模式


2.1设置色温

我们可以通过多种途径快速打开控制面板,如按下win+i键、在桌面上右键并选择“显示设置”等。在控制面板的显示设置界面中,我们可以找到护眼模式选项。护眼模式可以减少屏幕的蓝光辐射,以降低对眼睛的刺激。

openKylin(开放麒麟)

相较于单纯的开启色温,全天生硬的使用一个色温值,护眼模式则更加智能、更加贴心。在openKylin 2.0的护眼模式中,我们根据人的作息习惯引入了时间段的概念,并针对每个时间段提供不同的色温值,达到略微减少蓝光,中等减少蓝光,大量减少蓝光。三个时间段分别为:

  • 白天:日出之后~日落之前

  • 伴晚:日落之后1点之前

  • 深夜:1点到3点

  • 黎明:3点之后日出之前

每个时间段对应的色温值分别为:

  • 白天:4500k

  • 伴晚:3500k

  • 深夜:2800k

  • 黎明:3500k

同时,由于用户在使用电脑的时候系统主动调整屏幕的显示内容,是一件不符合用户使用习惯的事情。因此,为达到“悄悄的、不知不觉的、让用户无感的”效果。openKylin系统使用Linux社区的通用做法,使用一个小时的时间来进行色温过度,每分钟过度六十分之一。例如:

  • 白天:日落前一个小时开始向伴晚的色温渐变
  • 伴晚:12点开始向深夜的色温渐变
  • 深夜:2点开始向黎明的色温渐变
  • 黎明:日出前一个小时向白天的色温渐变

通过这种渐变的方式,openKylin系统可以实现在用户不知不觉中逐渐调整显示器的色温,避免突然的变化对用户造成不适。这种方法能够提供更加舒适的使用体验。

当然了,以上数据仅仅代表社区调研、分析的结论。三个档位的值并非是一个死值,他是以Gsettings存储的、可供用户自定义调整的。我们可以通过如下方法设置自己自定义的白天、黑夜,让“白天也懂夜的黑”

查询:

    白天:gsettings get org.ukui.SettingsDaemon.plugins.color eye-care-value
    
    伴晚:gsettings get org.ukui.SettingsDaemon.plugins.color eye-care-value-evening-dawn
    
    深夜:gsettings get org.ukui.SettingsDaemon.plugins.color eye-care-value-late-night
    
    黎明:gsettings get org.ukui.SettingsDaemon.plugins.color eye-care-value-evening-dawn

    设置:

      白天:gsettings set org.ukui.SettingsDaemon.plugins.color eye-care-value 4500
      
      伴晚:gsettings set org.ukui.SettingsDaemon.plugins.color eye-care-value-evening-dawn 3500 深夜:gsettings set org.ukui.SettingsDaemon.plugins.color eye-care-value-late-night  2800
      
      黎明:gsettings set org.ukui.SettingsDaemon.plugins.color eye-care-value-evening-dawn  3500

      当然如果设置错误,想要回复可以使用如下命令恢复为预设值:

        gsettings reset-recursively org.ukui.SettingsDaemon.plugins.color


        2.2实现原理

        目前openKylin系统采用的方案是通过调整显示器的gamma曲线来实现调整色温的效果。根据redshift的色温与RGB的对照表,将色温以100K为刻度进行拆分,每个刻度对应一组RGB的值。举个例子:

          {    { 1.0000, 0.0425, 0.0000 }, /* 1000K */    { 1.0000, 0.0668, 0.0000 }, /* 1100K */    { 1.0000, 0.0911, 0.0000 }, /* 1200K */    { 1.0000, 0.1149, 0.0000 }, /* ... */  /* ... */    { 1.0000, 0.2630, 0.0062 },/* 2000K */    { 1.0000, 0.4859, 0.1505 },/* 3000K */    { 1.0000, 0.6727, 0.3739 },/* 4000K */    { 1.0000, 0.8250, 0.6272 },/* 5000K */    { 1.0000, 0.9478, 0.8795 },/* 6000K */    { 1.0000, 1.0000, 1.0000 }, /* 6500K */    { 0.5944, 0.7414, 1.0000 } /* 10000K */};(https://gitee.com/openkylin/ukui-settings-daemon/blob/upstream/plugins/gamma-manager/rgb-gamma-table.h)

          当需要调整色温,将色温换算出一组rgb,然后根据rgb调整gamma曲线即可,此方案不仅可以调整显示的色温,同时还可以调整显示器的亮度。核心代码:

            for(int k = 0; k < m_pScreenRes->noutput; k++) {RROutput outputId = m_pScreenRes->outputs[k];XRROutputInfo  *outputInfo = XRRGetOutputInfo (QX11Info::display(), m_pScreenRes, outputId);QString outputname = QString::fromLatin1(outputInfo->name);if (outputInfo->connection != RR_Connected) {XRRFreeOutputInfo(outputInfo); continue;        }        if (!outputInfo->crtc) {            ret = true;            USD_LOG(LOG_ERR,"crtc size is 0.\n");            goto FREEOUTPUT;        }        size = XRRGetCrtcGammaSize(QX11Info::display(), outputInfo->crtc);        if (!size) {            ret = false;            USD_LOG(LOG_ERR,"Gamma size is 0.\n");            goto FREEOUTPUT;        }
                    /*        * The gamma-correction lookup table managed through XRR[GS]etCrtcGamma        * is 2^n in size, where 'n' is the number of significant bits in        * the X Color.  Because an X Color is 16 bits, size cannot be larger        * than 2^16.        */        if (size > 65536) {            ret = false;            USD_LOG(LOG_ERR,"Gamma correction table is impossibly large.\n");            goto FREEOUTPUT;        }
                    pCrtcGamma = XRRAllocGamma(size);        if (!pCrtcGamma) {            USD_LOG(LOG_ERR,"Gamma allocation failed.\n");            continue;        }        m_colorRGB.R == m_colorRGB.R ? m_colorRGB.R : 1.0;        m_colorRGB.G == m_colorRGB.G ? m_colorRGB.G : 1.0;        m_colorRGB.B == m_colorRGB.B ? m_colorRGB.B : 1.0;
                    gammaRed = 1 / m_colorRGB.R;        gammaGreen = 1 / m_colorRGB.G;        gammaBlue = 1 / m_colorRGB.B;
                    for (int i = 0; i < size; i++) {\            uint value = (i * 0xffff) / (size - 1);            pCrtcGamma->red[i] = value * m_colorRGB.R * brightness;            pCrtcGamma->green[i]= value * m_colorRGB.G * brightness;            pCrtcGamma->blue[i] = value * m_colorRGB.B * brightness;        }        XRRSetCrtcGamma(QX11Info::display(), outputInfo->crtc, pCrtcGamma);        XSync(QX11Info::display(), NULL);        XRRFreeGamma(pCrtcGamma);FREEOUTPUT:        XRRFreeOutputInfo(outputInfo);    }



            3.总结


            现在人们的生活中充满了各种光源,包括电脑、手机和照明设备等。不同的人对于光源的接受程度不同,有些人长时间接触光源而不会对视力产生影响,而有些人则相反。其实,色温只是决定光线特性的一个方面,流明也是需要考虑的重要因素。为了保护视力,除了选择合适的色温和流明,培养远眺的习惯和让眼部肌肉放松也是很重要的。

            openKylin操作系统中的护眼模式是一项既实用又方便的功能,它通过科学合理地调整屏幕色彩,减轻长时间使用电脑对眼睛可能造成的负担。同时,用户还可以根据自己的日常作息和视觉感受进行个性化设置,从而更好地保护视力。