是否有一种方法可以从该颜色的色调/阴影开始或将颜色的变化组合在一起?
例如:#9c2b2b/RGB(156,43,43)为暗红色#2354c4/RGB(132,162,232)为蓝色
但是给它两种颜色在Python中是否有办法确定这是红色(#FF0000 rgb(255, 0,0))或蓝色(#0000FF rgb(0, 0, 255))的变化
我知道怎么做,我在网上找到了很多教程和答案,关于如何通过基本色和乘法或减法来做渐变。
谢谢
我有几种方法可以做到这一点。下面的代码片段使用了库colorir
1。按感知距离对颜色进行分组
>>> from colorir import *
# These are the categories we want to fit the colors in
# You can use anything here, I just sampled a few CSS colors
>>> tints_dict = {
'red': '#ff0000',
'yellow': '#ffff00',
'green': '#00ff00',
'blue': '#0000ff',
'black': '#000000',
'white': '#ffffff'
}
>>> tints = Palette('tints', **tints_dic)
# Now to get the tint of a given color:
>>> tints.most_similar('#9c2b2b')
HexRGB('#ff0000') # Pure red
# If you want its name:
>>> tints.get_names(tints.most_similar('#9c2b2b'))[0]
'red'
这种方法的问题在于,我不认为你对"色调"的定义与对颜色距离的定义是相同的(颜色距离本身是非常有争议的,见此)。
这意味着如果我们向我们的'tints'数据集添加紫色,如'#800080',palette.most_similar('#9c2b2b')
将返回'#800080'。
这是因为'#9c2b2b'的感知亮度更接近我们的紫色而不是红色。一个可能的解决方法是只使用类似亮度的参考"色调"。
2。按色调分组
但是,这个解决方案可能更合适。
在这里,我们只关注它们的色调成分,而不是根据总体相似性对颜色进行分组。色相是颜色的"颜料",是HSL和HSV颜色系统的组成部分之一。
>>> def closest_hue(target, tints):
# Interprets input target as hex string, convert to HSL and get hue component
target_hue = HexRGB(target).hsl()[0]
closest = (None, 180)
for color in tints:
hue = color.hsl()[0]
hue_dist = (min(target_hue, hue) - max(target_hue, hue)) % 360
if hue_dist < closest[1]:
closest = (color, hue_dist)
return closest[0]
>>> closest_hue('#9c2b2b', tints) # 'tints' is the same palette defined previously
HexRGB('ff0000') # Pure red
这种方法的缺点,正如在原始帖子的评论中提到的,是它不能识别接近黑色,白色或灰色的颜色。
您还可以组合这些方法,例如,将非常接近黑色或白色的颜色与它们分组,否则它们应按色调排序。由于这个问题没有单一的答案,您必须尝试我所描述的方法,看看哪种方法最适合您。