从十六进制值检测相似颜色

9

有人知道两个十六进制颜色值之间如何取得相似度指数的方法吗?例如,两个黄色调可能会返回更高的指数,即它们比灰色和黄色更相似?(我使用JavaScript编写,但是猜测这样的公式/算法应该与语言无关。)


看起来很有前途,谢谢 Chris。 - alfonsob
2个回答

27

这里是一个可以开始的算法:

const yellow1 = "FFFF99";
const yellow2 = "FFFF00";
const blue = "0000FF";

function hexColorDelta(hex1, hex2) {
    // get red/green/blue int values of hex1
    var r1 = parseInt(hex1.substring(0, 2), 16);
    var g1 = parseInt(hex1.substring(2, 4), 16);
    var b1 = parseInt(hex1.substring(4, 6), 16);
    // get red/green/blue int values of hex2
    var r2 = parseInt(hex2.substring(0, 2), 16);
    var g2 = parseInt(hex2.substring(2, 4), 16);
    var b2 = parseInt(hex2.substring(4, 6), 16);
    // calculate differences between reds, greens and blues
    var r = 255 - Math.abs(r1 - r2);
    var g = 255 - Math.abs(g1 - g2);
    var b = 255 - Math.abs(b1 - b2);
    // limit differences between 0 and 1
    r /= 255;
    g /= 255;
    b /= 255;
    // 0 means opposite colors, 1 means same colors
    return (r + g + b) / 3;
}

console.log(hexColorDelta(yellow1, yellow2)); // 0.7999999999999999 
console.log(hexColorDelta(yellow1, blue)); // 0.19999999999999998 


0

我一直在搜索Pascal代码以寻找解决方案。

我放弃了对Pascal的限制,找到了这个问题。

Red()、Green()和Blue()函数替换了"parseInt"函数。

Result:=(R/255+G/255+B/255)/3

已替换

r /= 255;
g /= 255;
b /= 255;
return (r + g + b) / 3;

Bazza


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接