
晚上 10 点,灯关了一半。
儿子的中考复习冲刺期,电脑上整了各种资料试卷啥的,让他再电脑上看
我把 PDF 、word 啥的在 Mac 的 Preview 里打开,一道刺眼的白光直接糊脸上!!

试卷是黑白印刷的扫描件,纸白底+黑字,OCR 都不需要——但屏幕显示出来就是一面 27 寸的小太阳。
当然,如果跳出预览,用第三方软件,如 wps 上还有个护眼模式,但依然不完美,还是有点刺眼(我那挑剔的儿子......),

关键是,如上只能对可编辑的 word 、excel 有限,那些pdf 、图片上的背景是死的,wps 也变不过来!!
那一刻我突然意识到:原来“电脑护眼”这点,现在可能还没解决好!! 那咱自己试一下?
有了 AI,开始动手。
开始想法很直接,文件中大部分是背景,都变成黑色不就不刺眼了么?
需求很简单:给我一个目录,把里面所有 Word、PDF、Excel 全部转成黑底白字,眼睛友好版。
技术方案也很直接:
- PDF
:每页用 PyMuPDF 渲染成图片,PIL ImageOps.invert(img)一键反色,再合成新 PDF - DOCX
:python-docx 改 w:background为黑,所有 run 的w:color改白 - XLSX
:openpyxl 给每个单元格设置黑底白字
写完跑通,24 个化学试卷全部成功转换,命令行哗啦啦输出"✅ 完成"。
我赶紧打开第一个文件给儿子看。
他瞄了一眼,皱起眉头说:"这……感觉比原来还晃啊。"

我一开始还嘴硬:怎么可能?黑底白字不是最经典的护眼方案吗?
带着疑惑去查资料,一查吓一跳。
纯白
#FFFFFF+ 纯黑#000000的对比度高达 21:1——这是 sRGB 色彩空间能达到的物理上限。
而 W3C 的 WCAG 无障碍规范里,最高级别 AAA 推荐对比度 ≥ 7:1 即可保证可读性。
也就是说:21:1 比标准高了整整 3 倍。
对比度过高,会让眼睛在持续聚焦时反复调整瞳孔,长时间盯着就疲劳——这才是真正的伤眼元凶。
我开始观察那些"以护眼著称"的产品:
苹果的 macOS Dark Mode:背景 #1E1E1E 暗灰,不是纯黑 VS Code 的默认深色主题(Dark+):背景 #1E1E1E,文字 #D4D4D4,不是纯白 GitHub Dark:背景 #0D1117,文字 #C9D1D9,蓝灰偏暖 Kindle Paperwhite Dark Mode:暖灰底 + 暖米色字,像旧报纸的颜色
全行业的护眼标杆,没有一个用纯黑+纯白。

那一刻我才明白:
第一版工具不是"护眼",是给眼睛上了一副偏振墨镜——看起来颜色变了,眼睛仍在硬扛 21:1 的对比度。
明白了原理,重做。
新方案两个关键改动:
改动一:配色升级
参考 Kindle Paperwhite Dark Mode,定下默认主题(命名 warm):
```
背景:#1F1F1F 暖深灰(不是纯黑,给眼睛留呼吸空间)
文字:#D4C9A8 暖米杏(不是纯白,类似旧纸张暖色)
对比度:~11:1(清晰但不刺眼,远超 WCAG AAA 标准)
```
改动二:算法升级——温柔反色(gentle_invert)
普通反色只是简单的 255 - x:
原图白底 → 输出纯黑(仍然刺眼) 原图黑字 → 输出纯白(仍然晃眼) 图片孤立成一块"高对比度小岛",跟周围暖色文档格格不入
我引入查找表(LUT),让反色后的颜色直接落到主题色域。
效果立竿见影:
原图白底 (255,255,255) → 输出 (31,31,31) 暖深灰 原图黑字 (0,0,0) → 输出 (212,201,168) 暖米杏 中间灰度按线性插值
整页色调统一,图片完美融入文档,再也没有那种"小岛感"。

我用同一份化学试卷再让儿子看,他眯着眼仔细瞅了瞅,说:"哎,这个真的不晃了。"
那一晚,我第一次做出了让我自己也愿意长时间看的暗色文档。

这种看着眼睛舒服
既然技术框架对了,剩下的就是把它做成一个真正能用的工具。
支持的文件格式扩展到 5 类:(远远比 wps 等软件支持的多!)
| DOCX | |
| DOC | |
| XLSX | |
| 图片 |
主题也做了 4 套,按场景任选:

- warm
(默认推荐):暖杏色,类 Kindle Paperwhite Dark Mode - paper
:仿羊皮纸 sepia 暗色,复古纸感 - gray
:偏冷淡的暖灰系 - pure
:纯黑底白字(旧版兼容,警告:最刺眼)
每个主题都通过统一的 themes.py 配置,加新主题只要改三行配色——白板可拆,调色随意。
单个文件转换不算本事——真正解决问题的是批处理。
试想一下:你的"中考复习"文件夹里有 6 个学科子目录,几十个试卷文件,难道一个个手动转?
工具的核心入口是 darkmode_batch.py:
python3 darkmode_batch.py "/path/to/your/folder" --theme warm一行命令,自动完成:
- 递归扫描整个目录
,找出所有可处理文件 - 跳过 Word/Excel 的临时锁文件
( ~$xxx.docx)和已处理过的_dark文件 - 保留原目录层级
,输出到 dark/子目录 - 每个文件独立异常处理
,单个失败不影响其他文件 - 最后输出汇总报告
:成功几个、失败几个、总耗时

异常隔离这条非常重要——批处理的最大噩梦就是"跑了 80% 的时候挂了"。每个文件单独 try/except 包起来,再坏也只是少一个文件,绝不会让整个批处理崩盘。
理论说一万句,不如真跑一遍。
我直接拿儿子的"试卷"目录开刀:
```
/Users/.../乐天/c初三/试卷/
├── 12 个 PDF(数学/物理/英语/作文)
├── 化学/ 4 个文件
├── 英语/ 3 个文件
├── 语文/ 2 个文件
├── 道法/ 3 个文件
└── 历史五一作业/五一作业/ 5 张拍照作业 .jpg
```
一行命令丢进去:
python3 darkmode_batch.py "/path/to/试卷" --theme warm结果一气呵成:

- 29 个文档全部成功
,0 个失败 - 116 张内嵌题图全部温柔反色
跨 6 个学科子目录,目录层级完美保留 PDF 一共 230+ 页,全部 200dpi 渲染反色 - 总耗时 134 秒
(接近 5 分钟,主要是 PDF 渲染慢)

打开第一个化学试卷一看:暖深灰底、暖米杏字、题图也是同样色调融在一起。
整个文档像被裹在一层温柔的暖光里。
儿子那一晚多看了 40 分钟试卷没揉眼睛——这是这个工具最直接的验收。

我把整个工具开源到了 GitHub:
🔗 https://github.com/shiyousun/darkmode-doc-youge

仓库里有完整的代码、详细的 README、依赖清单、使用示例。
三步上手:
git clone https://github.com/shiyousun/darkmode-doc-youge.gitpip3 install -r requirements.txtpython3 scripts/darkmode_batch.py "/your/folder" --theme warm
四套主题随便切:
--theme warm # 暖杏色(默认推荐)--theme paper # 仿羊皮纸 sepia--theme gray # 暖灰色--theme pure # 纯黑白(不推荐)
(当然,如果你使用 AI 工具,直接用自然语言说就可以了)
“从 XX 下载这个 skill,之后把 XX 目录的所有文件标成护眼模式,具体选 XX 风格”
如果你也常常熬夜看资料、看试卷、看 PDF——clone 一份,用得舒服记得回来给个 ⭐。
发现问题或想加新主题,欢迎提 Issue,欢迎 PR。
写这个工具的过程,我有两个意外的收获。
第一个:错误的"护眼方案",比无防护还危险。
我们以为在保护眼睛,实际上只是换了个姿势让眼睛受罪。
如果你正在用任何"夜间模式"——先看看它是不是纯黑+纯白。如果是,赶紧换。
第二个:科技应该让人更舒服,而不是逼人硬扛。
我们的眼睛每天看屏幕的时间,已经远远超过身体设计的承受极限。
干眼症的发病年龄从 40 岁降到 20 岁,近视率从 30% 涨到 70%。
这不是身体不行,是科技产品默认设置就在欺负眼睛。
一篇白底文档、一道刺眼白光、一份 21:1 对比度——这些都是"小事"。
但小事日积月累,就是青光眼、干眼症、老花眼提前 10 年到来。
如果你也常常一坐就是几个小时盯屏幕,尤其是正在成长的孩子需要长时间看电脑屏幕——
愿你的眼睛被善待。
愿你看的每一份文档,都不再让你下意识皱眉、揉眼、揉太阳穴。
愿这个小工具,能给 你我及我们的孩子 长时间在电脑前工作或学习的人,一份小小的温柔.....
工具开源地址:https://github.com/shiyousun/darkmode-doc-youge
觉得好用,欢迎 ⭐;觉得有用,欢迎转发给身边那个总熬夜看屏幕的人。
当然,不止是电脑,转换后的文档 放到手机上看,一样是护眼的
夜雨聆风