我有一个带有递增颜色编号的表,以及相应的HTML-hex值。 (没有#的十六进制值)
line-height: 75px;
margin-top: 0px;
现在给我一种颜色,
e.g。 CREATE TABLE dbo.T_SYS_ColorToHex
(
COL_Number int NOT NULL
,COL_Hex varchar(6) NULL
,CONSTRAINT PK_T_SYS_ColorToHex PRIMARY KEY (COL_Number)
);
,需要在表格中找到最接近的颜色(T_SYS_ColorToHex)。
我该怎么做?
答案 0 :(得分:6)
为了定义差异,您需要先定义一个指标。
由于它是RGB,它在3d空间中,所以你可以简单地使用欧几里德范数/距离
sqrt((r 1 - r 2 ) 2 +(g 1 - g 2 ) 2 +(b 1 - b 2 ) 2 )强>
您需要提取每个组件(R,G,B)并将其转换为数字
,CONVERT(int, CONVERT(varbinary, SUBSTRING(COL_Hex, 1, 2), 2)) AS R
,CONVERT(int, CONVERT(varbinary, SUBSTRING(COL_Hex, 3, 2), 2)) AS G
,CONVERT(int, CONVERT(varbinary, SUBSTRING(COL_Hex, 5, 2), 2)) AS B
此外,您只是进行比较,因此您不需要有效值,只需要相对值。所以你可以跳过计算平方根。
然后你只需要在按距离排序时获得第一个元组。
所以这意味着,像这样:
SELECT
COL_Number
,COL_Hex
,R2
,G2
,B2
,R1
,G1
,B1
-- Comparisons are relative - SQRT not necessary
,--SQRT(
POWER((r1 - r2), 2) + POWER((g1 - g2), 2) + POWER((b1 - b2), 2)
--)
AS dist
FROM
(
SELECT
COL_Number
,COL_Hex
,CONVERT(int, CONVERT(varbinary, SUBSTRING(COL_Hex, 1, 2), 2)) AS R2
,CONVERT(int, CONVERT(varbinary, SUBSTRING(COL_Hex, 3, 2), 2)) AS G2
,CONVERT(int, CONVERT(varbinary, SUBSTRING(COL_Hex, 5, 2), 2)) AS B2
,CONVERT(int, CONVERT(varbinary, SUBSTRING(ColorToEvaluate, 1, 2), 2)) AS R1
,CONVERT(int, CONVERT(varbinary, SUBSTRING(ColorToEvaluate, 3, 2), 2)) AS G1
,CONVERT(int, CONVERT(varbinary, SUBSTRING(ColorToEvaluate, 5, 2), 2)) AS B1
FROM T_SYS_ColorToHex
CROSS JOIN
(
SELECT 'FF00FF' AS ColorToEvaluate
) AS tParam
) AS t
ORDER BY dist
OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY