如何将它们转换为RGB并找到主导颜色呢?
例如:
RED FF0000 rgb(255,0,0)
BLUE 0000FF rgb(0,0,255)
steelblue 4A7DAC rgb(74,125,172)
您可以使用RGB而不是HEX来实现此目标。
您可以查看以下算法:
https://dev59.com/tmox5IYBdhLWcg3wtmg1#9018100
编辑:
RGB和HEX计算无法处理灰色,因为每种颜色只有最接近灰色的距离。为此,可以使用颜色的HSV值,我已经加入了HSV的实现 :D
学到了很多:D
我在这里玩得很开心:
import math
colors= {
"red":"#FF0000",
"yellow":"#FFFF00",
"green":"#008000",
"blue":"#0000FF",
"black":"#000000",
"white":"#FFFFFF",
"grey": "#808080"
}
def rgb_to_hsv(r, g, b):
r = float(r)
g = float(g)
b = float(b)
high = max(r, g, b)
low = min(r, g, b)
h, s, v = high, high, high
d = high - low
s = 0 if high == 0 else d/high
if high == low:
h = 0.0
else:
h = {
r: (g - b) / d + (6 if g < b else 0),
g: (b - r) / d + 2,
b: (r - g) / d + 4,
}[high]
h /= 6
return h, s, v
check = "#808000".lstrip('#')
checkRGB = tuple(int(check[i:i+2], 16) for i in (0, 2 ,4))
checkHSV = rgb_to_hsv(checkRGB[0], checkRGB[1], checkRGB[2])
colorsRGB = {}
colorsHSV = {}
for c, v in colors.items():
h = v.lstrip('#')
colorsRGB[c] = tuple(int(h[i:i+2], 16) for i in (0, 2 ,4))
for c, v in colorsRGB.items():
colorsHSV[c] = tuple(rgb_to_hsv(v[0], v[1], v[2]))
def colourdistanceRGB(color1, color2):
r = float(color2[0] - color1[0])
g = float(color2[1] - color1[1])
b = float(color2[2] - color1[2])
return math.sqrt( ((abs(r))**2) + ((abs(g))**2) + ((abs(b))**2) )
def colourdistanceHSV(color1, color2):
dh = min(abs(color2[0]-color1[0]), 360-abs(color2[0]-color1[0])) / 180.0
ds = abs(color2[1]-color1[1])
dv = abs(color2[2]-color1[2]) / 255.0
return math.sqrt(dh*dh+ds*ds+dv*dv)
resultRGB = {}
resultHSV = {}
for k, v in colorsRGB.items():
resultRGB[k]=colourdistanceRGB(v, checkRGB)
for k,v in colorsHSV.items():
resultHSV[k]=colourdistanceHSV(v, checkHSV)
print("RESULT WITH RGB FORMULA")
print(resultRGB)
print(min(resultRGB, key=resultRGB.get))
print(resultHSV)
print(min(resultHSV, key=resultHSV.get))