编辑:
根据给出的答案我做了这个函数
function grabclosestcolor($r, $g, $b){
$colors = array(array(124,12,12),array(7,7,11),array(110,224,219),array(123,123,123),array(124,177,74),array(130,86,53),array(77,77,77),array(164,124,68),array(204,196,132),array(164,148,147),array(163,123,67),array(26,122,26), array(195,195,50),array(193,193,193),array(255,248,73),array(243,243,243));
$differencearray = array();
foreach ($colors as $value) {
$difference = sqrt(pow($r-$value[0],2)+pow($g-$value[1],2)+pow($b-$value[2],2));
array_push($differencearray, $difference);
$smallest = min($differencearray);
$key = array_search($smallest, $differencearray);
return $colors[$key];
}
}
我的目标是这个。我抓取一张图片并遍历每个像素并抓取它的 x、y 和 rgb。
我没有只抓取 rgb,而是有一个预定义的数组,我正在寻找从我抓取的颜色到预定义数组的最接近匹配项。 这里的目标是仅使用预定义数组中的颜色。 这是我的一系列颜色。
$colors = array(array(124,12,12),array(7,7,11),array(110,224,219),array(123,123,123),array(124,177,74),array(130,86,53),array(77,77,77),array(164,124,68),array(204,196,132),array(164,148,147),array(163,123,67),array(26,122,26), array(195,195,50),array(193,193,193),array(255,248,73),array(243,243,243));
这是我现有的循环遍历所有代码的代码。
$int = imagesx($im) - 1;
$int2 = imagesy($im) - 1;
$start2 = 0;
do{
$start = 0;
do{
$rgb = imagecolorat($im, $start, $start2);
$r = ($rgb >> 16) & 0xFF;
$g = ($rgb >> 8) & 0xFF;
$b = $rgb & 0xFF;
$value = rgb2hex($r,$g,$b).":$start:$start2";
array_push($colorsofimage, $value);
} while($int > $start++);
} while($int2 > $start2++);
rgb2hex 是一个用户定义函数,但我想要完成的是用函数更改该函数以获取最接近的颜色。
$colorsofimage 包含每个像素信息的数组,十六进制:x:y 我想要的是 rgb2hex(NEWFUNCTION($r,$g,$b)); 这样新的十六进制就是预定义数组中的 1。
我希望你能理解,因为我不知道如何去做,因为我不知道颜色的算法。
最佳答案
你必须计算到每种颜色的距离,并选择最小的。
有几种方法可以做到这一点。一个简单的方法是计算距离:
sqrt((r-r1)^2+(g-g1)^2+(b-b1)^2)
更好的方法可能是合并加权值来计算距离,例如转换 RGB->YUV 时使用的值:
Y = 0.299 * R + 0.587 * G + 0.114 * B
在那种情况下你会使用
sqrt(((r - r1) * .299)^2 + ((g - g1) * .587)^2 + ((b - b1) * .114)^2)
当然,因为您不需要精确的距离,只需要比较,您可以而且可能应该跳过平方根,进行最后的计算:
((r - r1) * .299)^2 + ((g - g1) * .587)^2 + ((b - b1) * .114)^2
关于php - RGB 到最接近的预定义颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28423357/