1
ryh 2021-10-07 13:10:58 +08:00 1
第一个需求 https://github.com/yannickl/DynamicColor
第二需求比较 HSL? |
3
James369 OP 关于第二个问题,颜色相似度比较,我初步设想一个方法:
1. 把所有颜色的色相信息均匀散布到一个圆环上。 2. 任给两个不同颜色,将对应圆环上的 2 个点。 3. 计算出这个 2 点之间的弧度差,越近则越相似。 但是第 1 步就不知道要怎么做? |
4
GreatEscape 2021-10-08 11:57:07 +08:00
@James369 你说的第一步,不就是转换为 HSL 或 HSB,比较 Hue 值么? Hue 值本身就是以 0 - 360 度表示的。https://www.december.com/html/spec/colorhsl.html
|
5
AlphaRobert 2021-10-08 13:48:53 +08:00
UIColor
参见 uiColor.getHue(_:saturation:brightness:alpha:) /* 这个 API 都没有被 Swiftified */ 和 UIColor(hue:saturation:brightness:alpha:) 1. 保持 hue 和 saturation 相同,调 brightness 。不过具体的变亮 /变暗方法有很多种,包括但不限于调 brightness 、plus lighter/darker 、直接跟白色 /黑色混合。 2. 判断 hue 之间的差值,必要时再判断 saturation 和 brightness 。但注意 HSB 和 HSL 模型的区别,两者的 S 也不尽相同 如果要自己写的话,HSB 和 HSL 算法都很简单 |
6
James369 OP @GreatEscape 恩,后来想想还有黑色 /白色要进行比较,Hue 还是不够。
|
7
James369 OP @AlphaRobert 我也想能不能简单处理一下,太暗的归为黑色,太亮的归为白色,饱和度差的归为灰色。其它按照 Hue 归为相应的彩色。
|
8
AlphaRobert 2021-10-08 15:02:59 +08:00 1
@James369 如果只是判断两个颜色相不相似的话不如直接用 RGB 来算,直接算平方和就可以了
|
9
James369 OP @AlphaRobert 妙,你是说把 rgb 直接映射到 xyz 三维空间,然后求空间距离,不错好简单的方法
|
10
James369 OP #8 先简单这么做吧,但其实还是有些问题,因为 RGB 颜色空间是不均匀的,那么通过距离来判断还是存在误差。
|
11
AlphaRobert 2021-10-08 22:28:22 +08:00 1
@James369 其实是不存在最优解的……常用的哪一种模型的色彩空间都不均匀。颜色这种东西本身就玄乎,最简单的 Gamma 每个人的评判标准都不一样,sRGB 的 Gamma 为 2.2,但我实际感觉更像 1.8 。并且色彩的相似还要考虑环境光,像 #000 和 #111 、#fff 和 #eee 在深浅色背景下的感知区别都不一样
|