Adjust图片亮度

给一个 RGB 颜色算两种亮度:感知亮度直接按 Rec.709 加权,相对亮度先把 sRGB 码值线性化再加权。默认取 #3498DB(52, 152, 219),感知亮度 135.5774、相对亮度 0.2830101020,配 1.2 倍时线性光缩放得 rgb(57, 165, 237),直接在码值上相乘得 rgb(62, 182, 255)。页面同时给出两者各自的对比度与实际线性倍数,附二十色对照表与批量换算,全程本地计算不上传。

同一个 ×1.20:线性光缩放把相对亮度从 0.2830101020 抬到 0.3389454885,sRGB 数值直乘抬到 0.4170003008。

默认示例是 #3498DB 配 1.2 倍。批量框里的五行色值与其他输入框被清空时,点「计算亮度」会填回默认示例;调色板表默认显示 12 行,点「加载更多」展开到 20 行。

使用方法

  1. R、G、B 三个通道默认 52、152、219,合起来是彼得河蓝 #3498DB,范围都是 0 到 255 的整数。改动任意一栏,或光标停在输入框里按回车,都会立刻重算。
  2. 「亮度倍数」默认 1.2,范围 0.1 到 3,方向键按 0.01 步进。大于 1 提亮,小于 1 压暗,两种方向跑偏的方向也不同。
  3. 「缩放方式」选的是主结果:线性光缩放或 sRGB 数值直乘。输出区两种做法都列出来,选中的那行前面标「主」;结果区第一行只报选中的那个,另一个放进「对照」。
  4. 「小数位」默认 4,作用于感知亮度与对比度;相对亮度自动多给 6 位(默认 10 位),因为它的值只在 0 到 1 之间,位数少了看不出差别。
  5. 「批量色值」默认写好五行,每行一个六位十六进制,允许带或不带井号。按 Ctrl+Enter(Mac 上 Cmd+Enter)一次算完;清空后点「计算亮度」会填回这五行。
  6. 输出区从上到下是:源色与它的两种亮度、对比度、按倍数跑出的两个结果、两种做法各自的实际线性倍数、跑偏的原因,最后是批量五行的两种结果。
  7. 工具区下方是二十色调色板按当前倍数实时换算的表,默认显示 12 行;「加载更多」展开余下 8 行,「导出 CSV」把二十行存成带字节序标记的文件。
  8. 通道填小数、超出 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 到 31.2
感知亮度Y0.2126R + 0.7152G + 0.0722B135.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与白对比
纯白#FFFFFFrgb(255, 255, 255)255.00001.00000000001.0000
银灰#BDC3C7rgb(189, 195, 199)194.01320.53972551631.7805
中灰#808080rgb(128, 128, 128)128.00000.21586050013.9494
铁灰#7F8C8Drgb(127, 140, 141)137.30840.25191280403.4778
湿沥青#34495Ergb(52, 73, 94)70.05160.06303303559.2893
纯黑#000000rgb(0, 0, 0)0.00000.000000000021.0000
彼得河蓝#3498DBrgb(52, 152, 219)135.57740.28301010203.1531
贝莱德蓝#2C3E50rgb(44, 62, 80)59.47280.045599086110.9834
绿松石#1ABC9Crgb(26, 188, 156)151.24840.38586351612.4090
翡翠绿#2ECC71rgb(46, 204, 113)163.83900.44958827882.1017
尼腓绿#27AE60rgb(39, 174, 96)139.66740.31547966832.8729
向日葵黄#F1C40Frgb(241, 196, 15)192.49880.58215117201.6610
胡萝卜橙#E67E22rgb(230, 126, 34)141.46800.31860196402.8486
南瓜橙#D35400rgb(211, 84, 0)104.93540.20189531384.1684
阿拉丁红#E74C3Crgb(231, 76, 60)107.79780.22484051373.8204
石榴红#C0392Brgb(192, 57, 43)84.69020.14307140565.4384
紫水晶#9B59B6rgb(155, 89, 182)109.74620.17490718424.6686
紫藤紫#8E44ADrgb(142, 68, 173)91.31340.12902157625.8652
灰蓝灰#95A5A6rgb(149, 165, 166)161.67060.36053001912.5577
钴蓝#2980B9rgb(41, 128, 185)113.61920.19412542334.3011

第二张表把两种做法的倍数对照列在源色 #3498DB 上:第二列是 k 的 2.2 次方,也就是码值直乘在线性空间里的理论倍数;后两列是两种做法实打实做到的倍数,二者的差来自四舍五入与上限夹取。

亮度倍数 kk 的 2.2 次方线性光实际倍数直乘实际倍数线性光结果直乘结果
0.500.21760.49760.2302#236EA1#1A4C6E
0.800.61210.79680.6186#2E89C6#2A7AAF
1.001.00001.00001.0000#3498DB#3498DB
1.201.49351.19761.4734#39A5ED#3EB6FF
1.502.44011.49032.2729#40B7FF#4EE4FF
2.004.59481.90062.8862#4AD0FF#68FFFF

结果边界、舍入与适用说明

常见问题

感知亮度和相对亮度该用哪一个?

挑颜色、排明暗用感知亮度,它直接对码值加权、接近肉眼;算对比度、做缩放必须先线性化用相对亮度,因为它正比于实际光强。两者不可互换。

为什么 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 里完成,没有发起任何网络请求,也不写入浏览器存储,刷新页面即恢复默认示例。

相关工具