使用方法
- R、G、B 三个通道默认
52、152、219,合起来是彼得河蓝 #3498DB,范围都是 0 到 255 的整数。改动任意一栏,或光标停在输入框里按回车,都会立刻重算。 - 「亮度倍数」默认
1.2,范围 0.1 到 3,方向键按 0.01 步进。大于 1 提亮,小于 1 压暗,两种方向跑偏的方向也不同。 - 「缩放方式」选的是主结果:线性光缩放或 sRGB 数值直乘。输出区两种做法都列出来,选中的那行前面标「主」;结果区第一行只报选中的那个,另一个放进「对照」。
- 「小数位」默认 4,作用于感知亮度与对比度;相对亮度自动多给 6 位(默认 10 位),因为它的值只在 0 到 1 之间,位数少了看不出差别。
- 「批量色值」默认写好五行,每行一个六位十六进制,允许带或不带井号。按 Ctrl+Enter(Mac 上 Cmd+Enter)一次算完;清空后点「计算亮度」会填回这五行。
- 输出区从上到下是:源色与它的两种亮度、对比度、按倍数跑出的两个结果、两种做法各自的实际线性倍数、跑偏的原因,最后是批量五行的两种结果。
- 工具区下方是二十色调色板按当前倍数实时换算的表,默认显示 12 行;「加载更多」展开余下 8 行,「导出 CSV」把二十行存成带字节序标记的文件。
- 通道填小数、超出 0 到 255,倍数超出 0.1 到 3,小数位不是 0 到 6 的整数,批量某一行不是六位十六进制,都会写明是哪一栏哪一行、为什么。
这个Adjust图片亮度工具能解决什么
把一张图提亮两成,多数人的第一反应是逐个像素把 R、G、B 各自乘 1.2。画面确实亮了,但亮过了头:中间调浮起,暗部层次被压缩,本就接近白色的区域成片糊成纯白。问题不在 1.2 这个数,而在乘法落错了空间——sRGB 存的是 gamma 编码后的码值而非光强,直接在码值上乘 1.2 等于把光抬到 1.2 的 2.2 次方 ≈ 1.49 倍。
第一类是给「亮一点」找个客观单位。口头说的提亮两成没有参照物,本页把它折成线性光的倍数:线性光缩放后 52、152、219 变成 57、165、237,相对亮度从 0.2830101020 抬到 0.3389454885;直接相乘给的是 62、182、255,相对亮度抬到 0.4170003008,实际做到 1.4734 倍。两边摆在一起,该给 1.2 还是更低的数就看得出差别。
第二类是压暗。偏差的方向同样:想要 0.8 倍,码值直乘实际做到 0.6186 倍,线性光缩放做到 0.7968 倍。压暗更隐蔽——画面整体变暗看起来「没错」,等发现暗部已糊成一团时,原文件可能已被覆盖。
第三类是可读性核算。对比度必须以相对亮度算:#3498DB 配白字只有 3.1531 : 1,够不到 AA 级的 4.5;配黑字是 6.6602 : 1。这类判断一旦用了没线性化的数值,结论完全站不住。
还有一类边界:本页只做单个颜色的数值核算,不读图片文件、不做直方图、不做局部提亮。要给整幅图调亮度,先换算好目标色,再拿这里的数去校准自己的算法。
计算原理与变量说明
整页用到两套亮度,差别只有一步:要不要先把码值还原成线性光。
感知亮度直接对 0 到 255 的码值加权:Y = 0.2126R + 0.7152G + 0.0722B。绿色权重接近蓝色的十倍,因为人眼对中波最敏感。它回答「这块颜色看起来有多亮」,适合挑颜色、排序、做灰度预览。
相对亮度要先做 sRGB 解码。通道除以 255 得 c,c ≤ 0.04045 时取 c/12.92,否则取 ((c + 0.055)/1.055)^2.4;三通道线性化后再用同一组系数加权。它正比于实际发光强度,对比度、叠加、缩放都必须在这一步之后做。
| 量 | 符号 | 算式 / 规则 | 默认值 |
|---|---|---|---|
| 通道码值 | R / G / B | 输入,0 到 255 的整数 | 52 / 152 / 219 |
| 亮度倍数 | k | 输入,0.1 到 3 | 1.2 |
| 感知亮度 | Y | 0.2126R + 0.7152G + 0.0722B | 135.5774 |
| 相对亮度 | L | 先线性化,再按同一组系数加权 | 0.2830101020 |
| 线性化 | E(c) | c ≤ 0.04045 取 c/12.92,否则 ((c+0.055)/1.055)^2.4 | — |
| 编码(逆运算) | E⁻¹(v) | v ≤ 0.0031308 取 12.92v,否则 1.055·v^(1/2.4) − 0.055 | — |
| 对比度 | C | (L₁ + 0.05) / (L₂ + 0.05),取较亮者作分子 | 白对黑 21 |
| 线性实际倍数 | f | 缩放后相对亮度 ÷ 缩放前相对亮度 | 1.1976 / 1.4734 |
128 这个数把非线性讲明白了。中灰 #808080 的码值是 128,128/255 = 0.501961,看上去刚好过半;线性化后却只有 0.2158605001,连四分之一都不到。反过来说,要相对亮度正好 0.5,码值得给到 188——0.5 编码后乘 255 等于 187.516,四舍五入就是 188,而不是 128。码值与光强之间是约 2.2 次幂的关系,这一点决定了亮度该怎么算。
为什么码值直乘会偏亮。记码值为 v、线性光为 V,则 v 约等于 V 的 1/2.2 次方。把 v 乘 k,等价于把 V 乘 k 的 2.2 次方:k = 1.2 时是 1.4935,k = 0.8 时只有 0.6121。中间调因此被抬到不该到的位置,暗部则被压得比预期更深。要表达的是「光的倍数」时,必须先进线性空间做乘法,再用编码公式还原。
线性光缩放也不等于分毫不差。结果要四舍五入回 0 到 255 的整数,8 位量化本身就有误差,所以 k = 1.2 实际做到的是 1.1976。倍数越大,偏差越容易被上限放大:k = 2.0 时只做到 1.9006,因为蓝通道在线性空间已超过 1.0 被夹住。这是位深的限制,不是公式的问题。
偏色来自被夹住的那一通道。两种做法内部都是三通道同比缩放,没有通道撞到边界时色相与饱和度都不变;一旦某通道先行撞到 255,比例失衡就开始偏色。#E74C3C(231, 76, 60)配 1.2 倍时红通道 231 × 1.2 = 277.2 早已越界,直乘结果是 (255, 91, 72),比线性光缩放出的 (250, 83, 66) 更偏橙。
两种对比度相乘恒等于 21。与白对比是 1.05/(L + 0.05),与黑对比是 (L + 0.05)/0.05,两者相乘正好是纯白对纯黑的 21。表格里只列与白对比,另一个用 21 除一下:中灰与白 3.9494,与黑约 5.3172。
完整示例(数值仅作演示)
默认一组:#3498DB(52, 152, 219),感知亮度 135.5774、相对亮度 0.2830101020。按 1.2 倍走一遍线性光缩放的红通道:
R:52 → 52/255 = 0.203922 → 线性化 0.034340 → ×1.2 = 0.041208 → 编码 0.224358 → ×255 = 57.2112 → 四舍五入 57 G:152 → 0.596078 → 线性化 0.313989 → ×1.2 = 0.376786 → 编码 0.647466 → ×255 = 165.1039 → 四舍五入 165 B:219 → 0.858824 → 线性化 0.708376 → ×1.2 = 0.850051 → 编码 0.930949 → ×255 = 237.3920 → 四舍五入 237 ⇒ 线性光缩放结果 rgb(57, 165, 237) #39A5ED
切到 sRGB 数值直乘是另一条路:52 × 1.2 = 62.4 取 62,152 × 1.2 = 182.4 取 182,219 × 1.2 = 262.8 已超上限、被夹到 255,得 rgb(62, 182, 255) #3EB6FF。两者码值只差 5 到 18,看配色稿几乎察觉不到,相对亮度却一个 0.3389454885、一个 0.4170003008,差近四分之一。
压暗一组:倍数改成 0.8,同一个 #3498DB 在线性光下得 rgb(46, 137, 198) #2E89C6,实际做到 0.7968 倍;直接相乘得 rgb(42, 122, 175) #2A7AAF,实际 0.6186 倍。想要降两成,后者降了近四成。
再换两个色:#808080(128, 128, 128)配 1.2 倍,线性光得 #8B8B8B,直乘得 #9A9A9A——这正是「128 的线性值不足一半」的直接后果。#E74C3C(231, 76, 60)配 1.2 倍,线性光得 #FA5342,直乘得 #FF5B48,红通道在这里被夹住。两端极端值很干净:#FFFFFF 与 #000000 无论乘多少都还是自己,白已满、黑没有光可乘。
常见颜色亮度对照表
下表列出二十种常见颜色在默认设置下的数值,全部由本页自己的函数算出,可逐行核对。最后一列是与纯白的对比度,与纯黑的对比度用 21 除以它即得。「复制对照表」复制的就是这张表(含表头,制表符分隔)。
| 名称 | 色值 | RGB | 感知亮度 Y | 相对亮度 L | 与白对比 |
|---|---|---|---|---|---|
| 纯白 | #FFFFFF | rgb(255, 255, 255) | 255.0000 | 1.0000000000 | 1.0000 |
| 银灰 | #BDC3C7 | rgb(189, 195, 199) | 194.0132 | 0.5397255163 | 1.7805 |
| 中灰 | #808080 | rgb(128, 128, 128) | 128.0000 | 0.2158605001 | 3.9494 |
| 铁灰 | #7F8C8D | rgb(127, 140, 141) | 137.3084 | 0.2519128040 | 3.4778 |
| 湿沥青 | #34495E | rgb(52, 73, 94) | 70.0516 | 0.0630330355 | 9.2893 |
| 纯黑 | #000000 | rgb(0, 0, 0) | 0.0000 | 0.0000000000 | 21.0000 |
| 彼得河蓝 | #3498DB | rgb(52, 152, 219) | 135.5774 | 0.2830101020 | 3.1531 |
| 贝莱德蓝 | #2C3E50 | rgb(44, 62, 80) | 59.4728 | 0.0455990861 | 10.9834 |
| 绿松石 | #1ABC9C | rgb(26, 188, 156) | 151.2484 | 0.3858635161 | 2.4090 |
| 翡翠绿 | #2ECC71 | rgb(46, 204, 113) | 163.8390 | 0.4495882788 | 2.1017 |
| 尼腓绿 | #27AE60 | rgb(39, 174, 96) | 139.6674 | 0.3154796683 | 2.8729 |
| 向日葵黄 | #F1C40F | rgb(241, 196, 15) | 192.4988 | 0.5821511720 | 1.6610 |
| 胡萝卜橙 | #E67E22 | rgb(230, 126, 34) | 141.4680 | 0.3186019640 | 2.8486 |
| 南瓜橙 | #D35400 | rgb(211, 84, 0) | 104.9354 | 0.2018953138 | 4.1684 |
| 阿拉丁红 | #E74C3C | rgb(231, 76, 60) | 107.7978 | 0.2248405137 | 3.8204 |
| 石榴红 | #C0392B | rgb(192, 57, 43) | 84.6902 | 0.1430714056 | 5.4384 |
| 紫水晶 | #9B59B6 | rgb(155, 89, 182) | 109.7462 | 0.1749071842 | 4.6686 |
| 紫藤紫 | #8E44AD | rgb(142, 68, 173) | 91.3134 | 0.1290215762 | 5.8652 |
| 灰蓝灰 | #95A5A6 | rgb(149, 165, 166) | 161.6706 | 0.3605300191 | 2.5577 |
| 钴蓝 | #2980B9 | rgb(41, 128, 185) | 113.6192 | 0.1941254233 | 4.3011 |
第二张表把两种做法的倍数对照列在源色 #3498DB 上:第二列是 k 的 2.2 次方,也就是码值直乘在线性空间里的理论倍数;后两列是两种做法实打实做到的倍数,二者的差来自四舍五入与上限夹取。
| 亮度倍数 k | k 的 2.2 次方 | 线性光实际倍数 | 直乘实际倍数 | 线性光结果 | 直乘结果 |
|---|---|---|---|---|---|
| 0.50 | 0.2176 | 0.4976 | 0.2302 | #236EA1 | #1A4C6E |
| 0.80 | 0.6121 | 0.7968 | 0.6186 | #2E89C6 | #2A7AAF |
| 1.00 | 1.0000 | 1.0000 | 1.0000 | #3498DB | #3498DB |
| 1.20 | 1.4935 | 1.1976 | 1.4734 | #39A5ED | #3EB6FF |
| 1.50 | 2.4401 | 1.4903 | 2.2729 | #40B7FF | #4EE4FF |
| 2.00 | 4.5948 | 1.9006 | 2.8862 | #4AD0FF | #68FFFF |
结果边界、舍入与适用说明
- 三个通道只接受 0 到 255 的整数。填 12.5 会提示不是整数,填 -1 或 300 会提示超出范围,都不会自动夹到边界。
- 亮度倍数只接受 0.1 到 3 的数。倍数填 0 没有意义——没有光的缩放倍数是不可讨论的,本页把 0 判为超出范围而不是给出一个全黑的结果。
- 小数位只接受 0 到 6 的整数,作用于感知亮度与对比度;相对亮度固定多给 6 位,最多 10 位。
- 源色是纯黑时相对亮度为 0,两个实际倍数相除无意义,这一行显示横线而不是 0 或无穷。
- 任何做法的结果都要夹回 0 到 255,包括线性光缩放。夹住就意味着丢层次,倍数越大丢得越多,这也是 k = 2.0 时线性光只做到 1.9006 的原因。
- 结果一律四舍五入到整数,8 位量化使线性光缩放的实际倍数逼近但不等于输入值,例如 1.2 得 1.1976。要更贴合就得先升到更高位深再算。
- 页面假定输入是 sRGB / BT.709 色域的 8 位值。Display P3、Adobe RGB 各有自己的传递函数与系数,不能把这套 2.4、0.04045 直接套过去。
- 页面不联网、不写本地存储;导出的 CSV 带字节序标记,Excel 打开不乱码。批量色值只用来换算,不会离开这台机器。
常见问题
感知亮度和相对亮度该用哪一个?
挑颜色、排明暗用感知亮度,它直接对码值加权、接近肉眼;算对比度、做缩放必须先线性化用相对亮度,因为它正比于实际光强。两者不可互换。
为什么 128 的灰不是「一半亮」?
128/255 = 0.501961 只是码值过半。sRGB 码值约等于光强的 1/2.2 次方,线性化后只有 0.2158605001。想要相对亮度正好 0.5,码值要给到 188。
相对亮度 0.5 对应哪个码值?
188。由编码公式算得 0.5 还原成码值是 187.516,四舍五入为 188。记住 128 只有 0.2159,就不会把码值当光强用。
码值直乘到底偏亮多少?
理论上偏到 k 的 2.2 次方倍:k = 1.2 时是 1.4935 倍。实际因上限夹取略低,本页实测 1.4734 倍。压暗同理偏多:k = 0.8 理论值 0.6121,实测 0.6186。
提亮之后颜色为什么看着偏了?
缩放本身不偏色,偏色来自被夹住的通道。以 #E74C3C 配 1.2 倍为例,红通道早已越过 255,直乘结果是 (255, 91, 72),比线性光缩放出的 (250, 83, 66) 更偏橙。
线性光缩放为什么也不正好是 1.2 倍?
因为结果要四舍五入回 8 位整数,且超出部分被夹住。1.2 倍实测 1.1976,2.0 倍因蓝通道先撞上限只做到 1.9006。这是位深的限制,不是公式错。
两种对比度数字有什么讲究?
与白对比是 1.05/(L + 0.05),与黑对比是 (L + 0.05)/0.05,两者相乘恒等于 21,也就是纯白对纯黑的极限值。表格里只列与白对比,另一个用 21 除一下即得。
输入的数据会上传到服务器吗?
不会。线性化、加权、编码、查表与导出全部在本页 JavaScript 里完成,没有发起任何网络请求,也不写入浏览器存储,刷新页面即恢复默认示例。