图片颜色反相工具

把图片的每个像素按通道取反:红绿蓝各自变成 255 减原值,alpha 原样保留。处理用 canvas 逐像素完成,不是叠一层 CSS 滤镜,所以导出的文件本身就是反相后的像素。也可以直接输入十六进制色值看它反相成什么。

未选图片时先跑一张内置渐变示例:320 × 120,逐像素处理。
图片:内置渐变示例(未选择文件) 尺寸 320 × 120,38400 像素 模式:朴素反相 255−v 十六进制反相:#315FE8 → #CEA017 -- 逐像素处理 -- 读取 imageData:38400 × 4 = 153600 字节 -- 十六进制色值反相 -- #315FE8 -> #CEA017(朴素) #315FE8 -> #FCF177(线性空间,gamma 2.2) #000000 -> #FFFFFF #FFFFFF -> #000000

原图

反相结果

灰阶反相对照表默认显示 12 行。

默认跑的是内置渐变示例,选一张图片后点「反相」就换成你的图。整页在浏览器本地处理,图片不会上传。

使用方法

  1. 打开页面先跑一张内置渐变示例:左边是原图,右边是逐像素反相后的结果,可以直接点「下载 PNG」拿走。
  2. 「选择图片」换成你自己的文件,再点「反相」。支持 PNG、JPEG、GIF、WebP,大小上限 20 MB;选了非图片文件会给出指明类型的提示。
  3. 「反相模式」二选一:朴素 255−v 是在 sRGB 编码空间直接取反;线性空间反相先按 gamma 线性化、取反、再编码回去。后者物理上更对称,中间灰附近差别最大。
  4. 「十六进制色值」默认 #315FE8,改一个字符就立刻重算,不用点按钮;结果同时给出朴素与线性空间两个答案。
  5. 「gamma」默认 2.2,范围 1 到 3,只影响线性空间反相那一栏;sRGB 的实际编码曲线在这个值附近,放大到 3 可以看出差异被拉得更开。
  6. 结果区上面一行是色值反相的结论,下面一段是逐像素处理的明细:尺寸、像素数、imageData 字节数、处理耗时、平均亮度变化。
  7. 「下载 PNG」把右边画布导出成文件;本页导出的就是反相后的像素本身,不是叠了一层滤镜的预览。
  8. 下面那张灰阶对照表默认显示 12 行,点「加载更多」展开全部 52 行,点「导出 CSV」存成带字节序标记的文件;「复制对照表」复制正文那张 gamma 对照表。
  9. 色值框填了不是 6 位十六进制的值、gamma 超出 1 到 3、图片超过 20 MB,都会给出指明原因的提示。

这个图片颜色反相工具能解决什么问题

第一类是把深色图转成浅底。扫描件、夜间截图、白底黑字的表格截图,反相之后在深色背景的阅读器里更舒服;胶片负片数字化后也要先反相才能看。这里的反相是真的改像素,导出的文件可以直接拿去用。

第二类是做设计对照。想知道某个配色反过来长什么样,把色值输进框里就行:#315FE8 反相成 #CEA017,#000000 与 #FFFFFF 互为反相。批量试色时比在调色盘里手动减 255 快得多。

第三类是排查可读性问题。很多人以为反相后对比度不变,其实不守恒:#333333 与 #C8D0EA 的对比度是 8.22:1,双双反相后 #CCCCCC 与 #372F15 是 8.28:1,不是同一个数。做深色模式时照着反相后的颜色直接上线,完全可能跌破 4.5:1 的可读门槛。

第四类是理解 gamma。直接做 255−v 是在编码空间取反,物理上并不对称;先把通道值线性化再取反,中间灰附近的差别能到 100 以上。这一页把两种结果并列,差别一眼可见。

计算原理与变量说明

整页有三条公式,分别对应色相、对比度与 gamma。

变量公式说明
朴素反相r' = 255 − r三个通道各自取反,a 不变
线性空间L = (v/255)^γ,v' = 255 × (1−L)^(1/γ)先线性化、取反、再编码
WCAG 对比度(L1 + 0.05) / (L2 + 0.05)相对亮度按 sRGB 线性化后加权
alphaa' = a不参与反相

反相不是取补色,也不是简单变亮。逐通道取反后色相会变、饱和度不变、亮度取反。RGB(200, 211, 234) 反相成 (55, 44, 21),是冷灰蓝变成暖深褐,而不是它的补色——补色要保持亮度关系,反相把每一条通道都推到对面。

对比度在反相下不守恒,这是本页最反直觉的一条。#333333 与 #C8D0EA 的对比度是 8.22:1;双双反相后 #CCCCCC 与 #372F15 是 8.28:1。反相后「看起来还行」是人眼自适应造成的错觉,深色背景配同色系浅字的组合反相后完全可能跌破 4.5:1 的可读门槛。

gamma 陷阱。sRGB 是 gamma 约等于 2.2 的编码空间,直接做 255−v 是在编码空间取反,物理上并不对称。正确做法是先线性化 L = (v/255)^2.2、取反 1−L、再编码回去:v = 32 时朴素得 223、线性空间得 254,差 31;v = 128 时朴素得 127、线性空间得 228,差 101;v = 223 时朴素得 32、线性空间得 137,差 105。中间灰附近的差异最大,这正是人眼最敏感的区间。

alpha 通道不参与反相。透明保持透明,否则半透明的边缘会突然变成不透明的白边或黑边。灰度图三通道等值反相后仍是灰度;彩色图反相后白底变黑底,打印与投影的耗墨、耗电明显更多,这也是夜间模式不能靠简单反相来做的原因之一。

完整示例(数值仅作演示)

打开页面时的默认色值是 #315FE8。朴素反相得 #CEA017(49→206、95→160、232→23);线性空间反相得 #FCF177。同一枚颜色,两种口径差出一大截,蓝色通道尤其明显:232 取反只有 23,在线性空间里却回到 119。

黑白两端不变:#000000 反相成 #FFFFFF,#FFFFFF 反相成 #000000。256 级灰阶的第 128 级反相成 127——因为取值是 0 到 255,中间那一对是 127 与 128,不是 128 与 128。

内置渐变示例是 320 × 120 的画布,共 38400 个像素、153600 字节的 imageData。逐像素处理时每个像素读 4 个字节,改前三个、留第四个,写回画布后再用 toDataURL 导出 PNG。

换成一张真实照片后,结果区会多出平均亮度一行:原图平均亮度越高,反相后越低,两者之和约为 255(按通道算术平均算)。

图片反相对照表

第一张表是 gamma 陷阱的核心数字,「复制对照表」复制的就是它。

原值 v朴素 255−v线性空间差值
02552550
3222325431
6419124958
128127228101
20055171116
21144156112
22332137105
2342111594
255000

第二张表是色值与对比度:反相前后成对列出,最后一列是 WCAG 对比度。

颜色对色值对比度说明
深色字 / 浅色底#333333 / #C8D0EA8.22:1原组合
双双反相后#CCCCCC / #372F158.28:1不是同一个数
可读门槛AA 级正文4.5:1反相后可能跌破
示例色反相#315FE8 → #CEA017—朴素口径
示例色反相#315FE8 → #FCF177—线性空间口径

第三张表是几个整块颜色的反相结果,用来快速核对。

颜色原色值反相后RGB 变化
纯黑#000000#FFFFFF0,0,0 → 255,255,255
纯白#FFFFFF#000000255,255,255 → 0,0,0
示例蓝#315FE8#CEA01749,95,232 → 206,160,23
冷灰蓝RGB(200,211,234)RGB(55,44,21)色相变、饱和度不变
中间灰灰阶第 128 级第 127 级128 → 127

读法:第一张看两种口径差在哪,128 附近差 101;第二张看对比度不守恒;第三张看整块颜色。

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

常见问题

反相是不是就是取补色?

不是。反相把每个通道推到对面:RGB(200,211,234) 变成 (55,44,21),色相变了、饱和度不变、亮度取反,和补色不是一回事。

反相后对比度会保持不变吗?

不会。#333333 与 #C8D0EA 是 8.22:1,双双反相后 #CCCCCC 与 #372F15 是 8.28:1。深色底配同色系浅字反相后可能跌破 4.5:1。

为什么中间灰差这么多?

因为 sRGB 是 gamma 约 2.2 的编码空间,直接 255−v 是在编码空间取反。v=128 朴素得 127、线性空间得 228,差 101,正好在人眼最敏感的区间。

透明区域会变成白边吗?

不会。alpha 通道不参与反相,透明保持透明。如果把 alpha 也取反,半透明边缘才会突然变成不透明的白边或黑边。

为什么 128 反相是 127 而不是 128?

取值是 0 到 255 共 256 级,255 − 128 = 127。中间那一对就是 127 与 128,不是两个 128。

导出的文件是真的反相了吗?

是。本页读 imageData 逐像素改前三个通道、写回画布,再用 toDataURL 导出,改的是像素本身,不是叠一层 CSS 滤镜。

反相后的图打印会更费墨吗?

会。大面积白底变黑底,打印与投影的耗墨、耗电明显更多,这也是夜间模式不能靠简单反相来做的原因之一。

图片会上传到服务器吗?

不会。文件只在浏览器里解码、逐像素处理、导出,没有发起任何网络请求,也没有写入本地存储。

相关工具