2017-11-01 15 views
3

私は、インクリメントカラー番号と対応するHTML - 16進値を持つテーブルを持っています。SQLで最も近い色を見つけるには?

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) 
); 

今は色所与AM(#なしのヘキサ値)、

例えば'007FFF'であり、テーブル(T_SYS_ColorToHex)に最も近い色を見つける必要があります。

どうすればよいですか?

+0

あなたはすべての可能な値を持っていない色に専用のデータベースを持っていますなぜですか? – SaggingRufus

+7

最も近いのはどちらですか? '017FFF'または' 007FFE'ですか? –

+0

@SaggingRufus:はい、整数と256色を使用する第三者アプリケーションがあります。 – User1

答えて

8

差分を定義するには、まずメトリックを定義する必要があります。
それはRGBですので、あなたは、単に

SQRT((R ユークリッドノルム/距離を使用することができるので、それは、3次元空間での - R) +(G - G ) +(B - B ))

あなただけの、また、あなただけの比較をやっているので、あなたは、実効値を必要としないすべてのコンポーネント(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 
関連する問題