配色方案
配色方案是从一个颜色出发、旋转它的色相得到的一组颜色。这些函数都在颜色自身的 space 里工作:
oklch 输入给出 oklch 结果,亮度与 chroma 不变、色相被旋转并归一化到 0..360。alpha 会保留。
它们需要带色相的 space。支持的有:hsl、hsv、hwb、hsluv、lch、lchuv、oklch、okhsl、
okhsv、okhwb,六个部分 CAM16 space cam16_jch、cam16_jmh、cam16_jsh、cam16_qch、
cam16_qmh、cam16_qsh,以及 cam16_ucs_jmh。没有色相的 space 会被拒绝:
SELECT plt_complementary(plt_lab(50, 20, -30));
先转换就是全部的修法:
SELECT plt_to_hex(plt_complementary(plt_convert(plt_srgb(1, 0, 0), 'oklch'))) AS complement;
这些函数返回方案里其余的颜色,顺序与 palette 一致,不包括输入颜色本身。它们共用同一种列表形状, 所以查询里可以一视同仁地处理:
SELECT list_transform(plt_triadic(plt_oklch(0.6, 0.15, 30)), lambda x: plt_to_hex(x)) AS triadic;
plt_complementary(color)
签名:plt_complementary(color plt_color) -> plt_color
色相环上正对面的颜色:色相 + 180°。这个函数返回单个颜色而非列表,因为补色只有一个颜色。
SELECT plt_to_hex(plt_complementary(plt_hsl(120, 1, 0.5))) AS complement,
plt_components(plt_complementary(plt_hsl(120, 1, 0.5))) AS complement_hsl;
plt_split_complementary(color)
签名:plt_split_complementary(color plt_color) -> plt_color[]
色相 + 150° 与 + 210° 处的两个颜色 —— 补色的两个邻居。
SELECT plt_components(plt_split_complementary(plt_hsl(120, 1, 0.5))[1]) AS first,
plt_components(plt_split_complementary(plt_hsl(120, 1, 0.5))[2]) AS second;
plt_analogous(color)
签名:plt_analogous(color plt_color) -> plt_color[]
色相 − 30° 与 + 30° 处的两个颜色。
SELECT list_transform(plt_analogous(plt_hsl(120, 1, 0.5)), lambda x: plt_to_hex(x)) AS analogous;
plt_analogous_secondary(color)
签名:plt_analogous_secondary(color plt_color) -> plt_color[]
再往外的一对:色相 − 60° 与 + 60°。它与 plt_analogous 合起来构成五色的邻近配色方案。
SELECT plt_components(plt_analogous_secondary(plt_hsl(120, 1, 0.5))[1]) AS minus_60,
plt_components(plt_analogous_secondary(plt_hsl(120, 1, 0.5))[2]) AS plus_60;
plt_triadic(color)
签名:plt_triadic(color plt_color) -> plt_color[]
色相 + 120° 与 + 240° 处的两个颜色。
SELECT list_transform(plt_triadic(plt_hsl(120, 1, 0.5)), lambda x: plt_to_hex(x)) AS triadic;
plt_tetradic(color)
签名:plt_tetradic(color plt_color) -> plt_color[]
色相 + 90°、+ 180° 与 + 270° 处的三个颜色 —— 也就是正方形方案。
SELECT list_transform(plt_tetradic(plt_hsl(30, 1, 0.5)), lambda x: plt_to_hex(x)) AS tetradic;
plt_monochromatic(color, count)
签名:plt_monochromatic(color plt_color, count INTEGER) -> plt_color[]
这里的例外:它保持色相与饱和度不变,让 HSV 的 value 从当前值起按 1/count 循环,并回绕到
0..1 —— 即 tinycolor 的 monochromatic。它恰好返回 count 个颜色,且第一个就是输入颜色本身,这一点
与上面的色相方案不同(那些不含输入色)。count 为 0 得到空列表,负数报错。结果留在输入的 space 里,
alpha 不变。
SELECT list_transform(plt_monochromatic(plt_srgb(1, 0, 0), 4),
lambda x: plt_to_hex(x)) AS reds,
plt_components(plt_monochromatic(plt_hsl(120, 1, 0.5), 3)[2]) AS second_hsl;
plt_harmony(color, scheme)
签名:plt_harmony(color plt_color, scheme VARCHAR) -> plt_color[]
六种方案按名字取用的入口。它接受 plt_color_schemes() 里的名字,外加别名 complement、
split_complement、triad 与 square。方案名来自某一列或某个参数时,就用它。六种方案都是旋转色相,
所以 monochromatic 不在其中 —— 它变的是 HSV 的 value,有自己的函数(见上)。
SELECT scheme,
list_transform(plt_harmony(plt_oklch(0.6, 0.15, 30), scheme),
lambda x: plt_to_hex(x)) AS colors
FROM (VALUES ('complementary'), ('split_complementary'), ('analogous'),
('analogous_secondary'), ('triadic'), ('tetradic')) t(scheme);
SELECT plt_to_hex(plt_harmony(plt_oklch(0.6, 0.15, 30), 'Square')[1]) AS first_of_square;
SELECT plt_harmony(plt_oklch(0.6, 0.15, 30), 'bogus');
plt_color_schemes()
签名:plt_color_schemes() -> VARCHAR[]
六个规范的方案名:complementary、split_complementary、analogous、analogous_secondary、
triadic、tetradic。
SELECT plt_color_schemes() AS schemes;