随机色
这些函数从 palette 的分布里采样:「在 space 内均匀」,具体怎么均匀由 palette 为每个 space 定义
(sRGB 各分量在 0..1 上,Lab 的 a/b 在 -128..127 上,色相绕整圈,饱和度/亮度按该 space 色体
的形状加权,等等)。
每个采样函数都要一个 seed。相同的 space 与 seed 永远给出相同的颜色,所以结果在不同查询、不同
机器之间都可复现,放在 EXPLAIN 里也是安全的。
plt_random_color(space, seed)
签名:plt_random_color(space VARCHAR, seed BIGINT) -> plt_color
在给定 space 里的一个颜色。
SELECT plt_random_color('oklch', 42) AS color,
plt_to_hex(plt_random_color('oklch', 42)) AS as_hex;
seed 就是全部状态:换一个得到不同的颜色,保持不变就得到同一个。
SELECT seed, plt_to_hex(plt_random_color('srgb', seed)) AS color
FROM range(1, 6) t(seed);
plt_random_colors(space, count, seed)
签名:plt_random_colors(space VARCHAR, count BIGINT, seed BIGINT) -> plt_color[]
从同一条带 seed 的序列里取出的 count 个颜色。逐次取出的值与相同 seed 的 plt_random_color 不同,
但对给定的 (space, count, seed),整条序列是固定的。
SELECT list_transform(plt_random_colors('srgb', 5, 42), lambda x: plt_to_hex(x)) AS colors,
length(plt_random_colors('srgb', 5, 42)) AS count;
count 为 0 得到空列表;负数会报错:
SELECT length(plt_random_colors('lab', 0, 7)) AS empty;
SELECT plt_random_colors('srgb', -1, 42);
生成测试数据或随机分类色板时很好用:
SELECT i, plt_to_hex(colors[i]) AS color
FROM (SELECT plt_random_colors('srgb', 6, 2026) AS colors) t,
range(1, 7) r(i);
plt_random_spaces()
签名:plt_random_spaces() -> VARCHAR[]
有随机分布的 34 个 space:15 个 RGB 空间(gamma 与线性两种变体)、hsl、hsv、hwb、lab、
lch、luv、lchuv、xyz、xyz_d50、yxy、luma、luma_linear、luma_gamma、oklab、
oklch、cam16_ucs_jab、cam16_ucs_jmh、lms 与 lms_von_kries。
SELECT list_count(plt_random_spaces()) AS count,
plt_random_spaces() AS spaces;
不在这个列表里的 space —— hsluv、okhsl、okhsv、okhwb,以及部分的 CAM16 空间
(cam16_jch、cam16_jmh、cam16_jsh、cam16_qch、cam16_qmh、cam16_qsh)—— 没有 palette
分布,无法采样:
SELECT plt_random_color('hsluv', 42);
SELECT plt_random_color('oklchh', 42);
在列表里的 space 中采样,需要别的 space 时之后再转换:
SELECT plt_convert(plt_random_color('oklch', 7), 'lch') AS as_lch;
错误
- 未知的 space 名,或者没有随机分布的 space,会让查询失败,错误信息会写明是哪个函数并列出支持的 space。
count为负数会让查询失败。- 任一参数为 NULL 返回 NULL。