我有十个十六进制/RGB颜色值(它们是肤色调)——我想能够找到与特定十六进制/RGB值最接近的匹配项。
我应该如何从起始颜色开始迭代,直到我落在特定范围内?但是如何组织这些范围?
老实说,我完全不知道如何做,或者要搜索什么,因此任何帮助或指引都将不胜感激。
干杯
我应该如何从起始颜色开始迭代,直到我落在特定范围内?但是如何组织这些范围?
老实说,我完全不知道如何做,或者要搜索什么,因此任何帮助或指引都将不胜感激。
干杯
虽然在RGB空间中使用欧几里得距离可能有所帮助,但更好的选择是使用正确的颜色模型。我建议使用LCH或至少HSL。然后为每个通道分配权重。例如,对于人眼来说,亮度是以对数刻度感知的。减小其影响可能会得到更好的匹配结果。因此,以下情况将不会发生:
#400(非常暗的红色)与#222(接近黑灰色,距离12)匹配,而不是#800(暗红色,距离16)
首先,这不一定是一个编程问题,但...
欧几里得距离是一个很好的方法。例如:
使用常规的html颜色名称,BlueViolet(#8A2BE2)和GoldenRod(#DAA520),哪个更接近LightSeaGreen(#20B2AA)?将3个十六进制值拆分为3D向量,如下所示:
BV = 138,43,226
GR = 218,165,32
LSG = 32,178,170
d(p,q) = sqrt((px - qx)^2 + (py - qy)^2 + (pz - qz)^2)
d(BV,LSG) = sqrt((138-32)^2 + (43-178)^2 + (226-170)^2)
d(BV,LSG) = sqrt(11236 + 18225 + 3136)
d(BV,LSG) = sqrt(32597)
d(BV,LSG) = 180.546
d(GR,LSG) = sqrt((218-32)^2 + (165-178)^2 + (32-170)^2)
d(GR,LSG) = sqrt(34596 + 169 + 19044)
d(GR,LSG) = sqrt(53809)
d(GR,LSG) = 231.967
正如您所看到的,d(BV,LSG)
比d(GR,LSG)
小,因此BlueViolet比GoldenRod更接近LightSeaGreen。
d = sqrt((x1-x2)^2,(y1-y2)^2,(z1-z2)^2,)
只需计算您的颜色与所有颜色之间的距离,并找到最小值,那么您的颜色将最接近特定颜色。
如果您在编码时遇到任何问题,请随时提问。