自从去年体检的时候发现视乳头杯盘比有些异常之后,我就特别在意用眼健康了。虽然复查显示并无大碍,但用眼健康成为了我关注的问题。因此,我写了 Daisy 这个护眼软件,希望从环境光调节的角度改善用眼体验。

对护眼方案的思考

对于长期需要对着电脑屏幕的人群来说,护眼是一个非常急切,也是名目繁多的议题。除了系统自带的 Night Shift、True Tone,第三方软件还能监测用眼时间、调节色温、屏幕亮度、明暗主题……总结来说,现有的护眼方案主要集中在以下四个要素上:亮度、色温、明暗主题和用眼时间。

首先,在亮度方面,macOS 系统自带随着环境亮度而改变屏幕亮度的功能,只需在设置中点选开启即可。如此一来,当环境光发生改变的时候,用户就不必再忍受不合适的屏幕亮度,这倒是方便了不少。

macOS 系统下设置自动调节屏幕亮度

其次,在色温方面,除了 macOS 自带的 Night Shift 功能之外,f.lux 也是一个不错的选择,它们的功能近似,都允许用户设置自己的时间方案,选择在白天将屏幕色温调整得更冷一些,而在夜晚相应地更暖一点。f.lux 还可以根据所在地的日出日落时间来帮助用户自动调整。如果用户使用一台 Windows 电脑和飞利浦智能灯泡,就可智能地调整灯泡的色温。

macOS 系统下设置 Night Shift
f.lux 与智能设备色温调整

其三,在明暗主题方面有很多软件工具,比如将一键明暗放置于任务栏的 One Switch,又如少数派曾经推荐过的Dynamic Dark Mode,可以根据环境光切换明暗主题。

最后,在用眼时间监控方面,我个人使用的就是 Eye Monitor,作为一款监测用户用眼时间的软件,它经常善意地提醒我休息眼睛,尤其是在精神集中、忘却时间流逝的工作中。这让被提醒的我常常恍然地意识到,我又在不知不觉中忘记了眼睛的感受。

是否还有更好的护眼方式?

如此四种护眼方案体验下来,亮度调节和时间监控都以相当可感的方式改善了用眼体验。但色温调节软件的效果却可能是次要的。虽然长时间蓝光确实让眼睛疲劳,但市面上已经有自带过滤功能的屏幕膜,可做到硬件级的 24 小时过滤,故软件端似乎不那么必要。另外,作为摄影爱好者,改变屏幕色温往往会影响图片展示和编辑,若是需要手动关闭色温调节,那反倒增添了麻烦。

我也开始思考,明暗主题是否真的具有护眼意义。暗主题以深色背景配浅色文字,确实显得更清晰了,但在我的使用体验中,只要稍微注视屏幕一段时间,眼睛就很容易疲劳,浅色的字周围仿佛生出了光晕一般……虽然暗主题在低光源背景下增强了文字对比度,显得更清晰,但我却觉得更费眼力了。

我想,问题的关键可能是环境光的亮度。我想起小时候经常被教导的内容:不要在日光直射下看书,光线太强会伤眼;也不要在黄昏时的暗处看手机,因为环境光太暗,容易增加用眼疲劳。

上述四种软件的作用机制也启发了我。虽然已有的四种方案里已经包含了亮度因素,但那更多地是屏幕的亮度属性,而非环境光亮度。我发现,除了用眼时间监测之外,调节屏幕属性的软件都使用了环境光作为自变量,例如:根据环境光调整屏幕亮度、根据环境光调节屏幕色温、根据环境光改变明暗主题。那么,我突发奇想,如果视疲劳的原因是环境光的亮度,那么为什么不能反过来调整环境光的亮度呢?

于是,我把自己护眼的重点放在了两点上,一是用眼时间,二是环境光线。一方面是减少连续用眼时间,另一方面则是保证环境光不至于太暗或者太亮,使单位时间内用眼更轻松。而在环境光亮度调节方面似乎没有什么现成的软件产品,故我打算做一个。Daisy 就这样诞生了。

在我最初的构想中,Daisy 应当包含两种功能。一者是提醒功能,这参考了用眼监测软件的成功之处。另一者则参考了 f.lux 通过智能设备改变灯泡色温的思路,主动调节环境光亮度。

这两个功能既相互关联,也彼此分隔。亮度提醒所检测到的亮度数值需要用于判断是否调节环境光,而调节环境光并非一个必需功能,对于不在智能设备环境中的使用场景来说,提醒才是最重要的。因此我不仅需要把这两个功能连接起来,也需要在必要的位置使二者各自独立存在,并且可在后台持续地以一定的时间间隔动态监测。

环境光与屏幕亮度检测

首先遇到的难题是,我如何检测环境光?既有的产品多半使用了设备上自带的光线传感器,但且不论获取传感器数据的方式不易,我担心随着 macOS 系统的不断迭代,传感器数据将有可能变得无法获取。这时,还是 Dynamic Dark Mode 的方案吸引了我:使用屏幕亮度间接检测环境亮度。系统正有根据环境光调节屏幕亮度的功能,其原理为,环境光越亮,则屏幕越亮,环境光越暗,则屏幕越暗。那么,只要在屏幕亮度过暗或者过亮的时候发出提醒,就能对应地提醒用户此时环境光的亮度了。

但紧接着问题又来了,我该如何动态地获取屏幕亮度呢?

我本以为获取屏幕亮度要比获取亮度传感器来得容易得多,不过我低估了 macOS 在这方面的设置,在我的尝试中,连 AppleScript 也无法很容易地获取这方面的信息。

于是我想到了捷径(Shortcuts)。我之前看到 Jordi Bruin 写过一个小工具——FluTooth,就是借助捷径来实现核心功能的。既然如此,何不尝试一下呢?

于是我将检测和提醒功能写在了提醒脚本中。运行这个脚本,它将此时的屏幕亮度反馈给我,同时自行判断是否需要弹出提醒。我将提醒的阈值分别默认为 20% 和 90% 的亮度。如此,我便可以通过 AppleScript 来发出执行捷径脚本的命令,并收到捷径脚本传递的亮度数据了!

检测屏幕亮度并提醒

可能会有朋友发现一个细节,我并没有把亮度的最低值写成 0,这是为了避免熄屏时或将屏幕亮度关闭时产生的误检测。另外,我也在代码中增加了前置窗口检测,若检测到锁屏状态,则停止检测屏幕亮度,如此便不至于在一打开屏幕、解锁之后突然冒出一大堆亮度提醒。

原本我可以在提醒的条件分支中直接加上智能调节,但是为了让提醒功能和调节功能分别独立——你也不想出门在外、没有智能设备的时候收获一大堆报错对吧——因此,我又分别制作了两个智能控制捷径。

提醒之后:智能控制

我在软件中将智能控制设置成了可选项,这样一来,用户就可以选择是否触发调整,并且也可以设置调整的临界值。

Daisy 的设置页面

调整的思路很简单,获取当前环境光线的亮度值,在此基础上增加或者减少单位亮度即可。但是捷径并没有我想象得那样简单。我发现连接 Home 的智能设备无法在捷径中使用代码或者命令明确地调整亮度!取而代之的是,苹果设计了一个拖动界面,设备的亮度值只能通过手动拖拽设置,这大大减少了扩展功能的可能性,对习惯于使用代码命令的人来说,无疑是一个坏消息。

只能手动设置固定数值的界面

因此,我想出了这样的对策:制作鱼鳞一样的条件选项,将固定的亮度范围上调或者下调一定的值,达到调整亮度的目的。不过这样也会稍微提高用户的使用门槛,需要在每一个条件支中设定目标亮度值。因此,我区分了调高脚本调低脚本两个情景,例如,在调高情景中,我的做法是,首先将亮度分成 10% 为一单位的梯度,接着在每一个梯度上,目标亮度都在梯度区间最大值的基础上再增加 10% 。这样就可以使梯度中任何一种亮度情况普遍地提升 10-20%。当然,既然是捷径脚本,那么用户可以根据自己的喜好来客制化地调节。在后续的使用中,我也发现,细致地调整亮度可能不是最常用的,打开和关闭环境光或许是更直接有效的方法,而且也无需繁多的设置。当然,这并不意味着需要对原有的脚本大动干戈,只需新建立一个脚本,然后将新脚本的名称填入设置中即可。

鱼鳞一样的条件选项

最后

考虑到使用情景和需求门槛,我将 Daisy 区分成了两个版本,并将带有智能调节的完整版制作成了付费软件,售价仅一美元,希望大家在明白了我制作软件的心路历程之后能够多多支持,也欢迎朋友们来使用免费的版本,非常小巧精致。上述两个版本都可以在我的项目地址下载,欢迎多来转转!

Daisy 主题图

Daisy 是我开发的第 14 个软件。它也给我带来了一些启发和思考。譬如在人工智能热潮之后,独立软件写作应该如何找到自己存在的价值和基点?我的选择是写尽可能小而精致的工具,在尽可能的情况下,为开源社区提供更多作品,并且可以兼顾创作者的付费需求,开发不同的版本。希望这一个小小的作品能解决一个问题、满足一个需求!如果你想看到更多记录与想法,欢迎订阅我的微信公众号「夜行人的笔记」。