zb3/gnome-gamma-tool
GitHub: zb3/gnome-gamma-tool
一个在 GNOME 和 Cinnamon 上通过修改颜色配置文件持久调整 Gamma、对比度、亮度的命令行工具。
Stars: 196 | Forks: 22
# gnome-gamma-tool
一个命令行工具,允许您在 GNOME 和 Cinnamon 中持久地更改伽玛、对比度和亮度,方法是通过创建包含 VCGT 表的颜色配置文件。
## 免责声明
**此工具仅适用于 GNOME 和 Cinnamon**。已在 Fedora 上的 GNOME 42-48 以及 Cinnamon 上测试过,可能与更旧/更新的版本不兼容,不过已经生成的配置文件应该能继续使用。
这有点取巧,颜色配置文件本来不应该这样使用。但我认为这个用例足够罕见,可以证明这种做法合理。毕竟,如果你的显示器不允许你更改伽玛,那不就是显示器的问题吗?
请参阅[工作原理](#how-it-works)获取更详细的描述。
**注意:** 无法更改屏幕饱和度或色调(由于 VCGT 限制),但你可以尝试使用 [gnome-saturation-extension](https://github.com/zb3/gnome-saturation-extension)(不过它也有缺点)。
## 使用方法
无需安装,只需克隆此仓库:
```
git clone https://github.com/zb3/gnome-gamma-tool
cd gnome-gamma-tool
```
**如果**您使用的是 Debian/Ubuntu,可能还需要先安装 `gir1.2-colord-1.0` 包:
```
sudo apt install gir1.2-colord-1.0
```
对于 OpenSUSE,您可能需要安装 `typelib-1_0-Colord-1_0` 包:
```
sudo zypper install typelib-1_0-Colord-1_0
```
如果您使用的是 NixOS,请查看[这条评论](https://github.com/zb3/gnome-gamma-tool/issues/28#issuecomment-3112277504)
然后您可以像这样调用工具:
```
./gnome-gamma-tool.py
```
(如果这不起作用,请[在此处](https://github.com/zb3/gnome-gamma-tool/issues/new)打开一个新问题)
一旦新配置文件安装完毕,就可以安全地移除本工具。
### 调整屏幕伽玛
`-g` 参数允许您指定伽玛校正因子。您也可以使用 `R:G:B` 的形式为各个通道单独设置。
例如:
```
./gnome-gamma-tool.py -g 0.8
```
或者
```
./gnome-gamma-tool.py -g 0.8:0.8:0.8
```
### 调整对比度(或反转颜色)
您也可以使用 `-c` 参数更改对比度。`1` 是默认值,而 `-1` 将有效反转颜色。请不要在此处使用 `0` 值,因为它会使您的显示画面全部变灰……
例如:
```
./gnome-gamma-tool.py -c -1
```
注意它总是从初始状态开始,因此上面的命令会撤销任何之前的伽玛调整,但您可以组合不同的选项:
```
./gnome-gamma-tool.py -g 0.8 -c 0.5
```
这里也支持逐通道设置,因此例如可以反转蓝色通道,同时保持红色和绿色不变。您猜得到这会是什么效果吗?试试看:
```
./gnome-gamma-tool.py -c=1:1:-1
```
这就是您预期的效果吗?:)
### 更改色温
色温也可以更改,使用 `-t` 选项指定色温。值与 `redshift` 中的工作方式相同,`6500` 是中性值。注意这不会阻止“夜间模式”功能工作,只是夜间模式的调整是在 gnome-gamma-tool 所做调整的“之上”进行的。
```
./gnome-gamma-tool.py -t 5000
```
### 调整亮度(某种程度上)
您也可以使用此工具调整亮度,但无法增加物理显示器的亮度,只能通过降低最大亮度值来降低亮度。使用 `-b` 选项,它接受 `0` 到 `1` 之间的值,其中 `1` 是中性值:
```
./gnome-gamma-tool.py -b 0.7
```
还有一个选项允许您*增加* *最小*亮度值。那就是 `-bm` 选项,它也接受 `0` 到 `1` 之间的值,这一次 `0` 是中性值。执行以下操作后:
```
./gnome-gamma-tool.py -bm 0.3
```
输出值永远不会小于 `0.3`,因此黑色不再是黑色,而是变成灰色,而白色仍然是白色,中间的颜色将相应地相乘。也可以使用 `-b` 和 `-bm` 的组合来反转颜色:
```
./gnome-gamma-tool.py -b 0 -bm 1
```
而且……这还不是全部,因为这些选项也支持逐通道操作,这要归功于 `R:G:B` 表示法。这开启了新的可能性,比如……让您的屏幕更绿(这是通过色温无法实现的):
```
./gnome-gamma-tool.py -b 1:2:1
```
上述内容首先被转换为 `0.5:1:0.5`,技术上它使您的屏幕红色和蓝色减少,但实际上让屏幕看起来更绿。真是实用的功能,您不觉得吗?
### 如果您有多台显示器
您可以使用 `-d` 选项指定显示器的*索引*(第一台显示器的索引为 `0`,但这是默认值,因此在这种情况下您不需要使用此参数)。显示器的顺序与 `设置 -> 颜色` 面板中的顺序相同。示例如下:
```
./gnome-gamma-tool.py -d 1 -g 0.7
```
您也可以使用 `-a` 选项将所有更改应用到所有显示器:
```
./gnome-gamma-tool.py -a -g 0.7
```
### 导出到文件
如果您只想创建一个带有适当 VCGT 表的 ICC 配置文件,而不与当前配置交互,可以使用 `-o`/`--out-file` 参数。注意它不会加载您当前的配置文件,因此输出将是 sRGB 配置文件,除非您使用 `-i`/`--in-file` 参数来指定基础配置文件。
然后您可以使用像 `colormgr` 这样的工具导入并应用它。
```
# 创建 myprofile.icc 文件
python3 ./gnome-gamma-tool.py --min-brightness 0.05 --brightness 0.95 --out-file myprofile.icc
# 此命令将打印 Device ID,保存它
colormgr get-devices
# 此命令将打印 Profile ID,保存它
colormgr import-profile myprofile.icc
# 此命令将立即影响颜色
colormgr device-add-profile $displayId $profileId
# 此命令将删除导入的 profile 并立即将颜色恢复为原始状态
colormgr delete-profile $profileId
```
## 工作原理
Mutter(GNOME 的合成器)没有实现任何可能有所帮助的 Wayland 协议,因此像 `gammastep` 或 `wl-gammactl` 这样的工具无法工作。不过,Mutter 通过 D-Bus 暴露了 `SetCrtcGamma` 方法,该方法确实有效。然而 gnome-gamma-tool 并不是通过这种方式实现其目的的,因为:
* 该值不会保存在任何地方,因此效果不是持久的
* 这个方法已经被另一个守护进程调用,因此效果只是暂时的。
该方法通常由 `gsd-color` 守护进程(间接)调用,目前有两样东西可以影响其参数:
* 当前启用的颜色配置文件的 VCGT 表(通过 colord 检索)
* 从“夜间模式”设置中推导出的色温
(这两者会合并在一起)
现在,显而易见的解决方案似乎是修补 `gsd-color`,使其也考虑其他因素(比如一个 GSettings 属性),这样您就可以通过 `gsettings` 命令来调整伽玛。这也将开启以后在显示面板中添加 GUI 的可能性。
然而,这也不是 gnome-gamma-tool 的工作方式,因为修补 `gsd-color` 只有在补丁被合并到上游时才有意义。否则,对我来说(可能对你也是)完全不可接受的是必须应用自定义补丁并重新构建 GNOME 的各个部分。这就是为什么 gnome-gamma-tool 会安装一个带有正确“VCGT”表的颜色配置文件。
`gsd-color` 不管理颜色配置文件,它通过 colord 提供的 API 观察它们。要使配置文件被 `gsd-color` 识别,必须完成以下工作:
* 必须为给定设备启用颜色配置文件
* 该配置文件需要被安装(在 colord 数据库中)
* 该配置文件必须与设备关联
* 该配置文件必须被启用
所有这些步骤都是通过 colord 通过 D-Bus 暴露的 API 执行的。gnome-gamma-tool 不会从头创建新配置文件(除非您指定 `-o`/`--out-file`),而是克隆当前配置文件并仅修改 VCGT 表。默认情况下,当前配置文件是 `gsd-color` 根据 EDID 数据生成的。
`d-color` 使用 D-Bus 信号监听设备/配置文件的变化,因此它会拾取我们的配置文件更改,然后最终调用 `SetCrtcGamma`。就是这样!
那么这个“VCGT”是什么?VCGT(显卡伽玛表)基本上映射颜色通道(R、G 和 B)值。比如,如果一个通道的值为 `X`,那么 VCGT 指定这应该被转换为 `Y`。当然,并非每个输入值都有 VCGT 条目,该表只有 256 个条目,并且值会被插值(但这并非由 gnome-gamma-tool 完成)。
VCGT 使得更改伽玛(通过指数运算)、对比度和亮度成为可能,但无法通过这种方式更改色调,因为一个通道无法影响其他通道。
标签:Cinnamon, colord, Gamma调整, GNOME, Linux桌面, Python, VCGT表, Wayland, 二进制发布, 亮度, 对比度, 屏幕调整, 开源工具, 持久化配置, 无后门, 显示器校准, 色彩管理, 逆向工具, 颜色配置文件