如何在SQL中找到最近的颜色?

时间:2017-11-01 15:12:29

标签: sql sql-server tsql sql-server-2016

我有一个带有递增颜色编号的表,以及相应的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)。

我该怎么做?

1 个答案:

答案 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