从颜色数组中找到最接近的匹配 RGB 颜色
Finding nearest match RGB color from array of colors
我知道我需要使用循环来查看 $palette
数组,但我需要帮助进行颜色比较。
目标是找到 $rgbcolor
最接近 $palette
的值,并显示与 $palette
.
相匹配的颜色
<?php
//input color
$rgbcolor = array(110,84,43);
//listed color
$palette = array(
array(238,216,152),
array(252,216,113),
array(253,217,0),
array(255,208,62),
array(255,182,20),
array(206,137,0),
array(235,169,0),
array(170,137,0),
array(173,132,28),
array(183,131,0),
array(139,120,37),
array(108,86,26)
);
?>
确定颜色“距离”的方法有很多种。
有绝对距离,即各通道值之差之和:
/**
* Find the "naive" difference between two colors.
* @param int[] $color_a Three-element array with R,G,B color values 0-255.
* @param int[] $color_b Three-element array with R,G,B color values 0-255.
* @return int
*/
function absoluteColorDistance(array $color_a, array $color_b): int {
return
abs($color_a[0] - $color_b[0]) +
abs($color_a[1] - $color_b[1]) +
abs($color_a[2] - $color_b[2]);
}
亮度也有差异,这将提供更多与颜色无关的比较:
/**
* Find the difference between two colors' luminance values.
* @param int[] $color_a Three-element array with R,G,B color values 0-255.
* @param int[] $color_b Three-element array with R,G,B color values 0-255.
* @return int
*/
function luminanceDistance(int $color_a, int $color_b): int {
$luminance_f = function ($red, $green, $blue): int {
// Source: https://en.wikipedia.org/wiki/Relative_luminance
$luminance = (int) (0.2126 * $red + 0.7152 * $green + 0.0722 * $blue);
return $luminance;
};
return abs(
$luminance_f($color_a[0], $color_a[1], $color_a[2]) -
$luminance_f($color_b[0], $color_b[1], $color_b[2])
);
}
一旦你弄清楚了如何比较颜色,你需要解决的下一个问题就是找到与你的目标颜色距离最小的颜色:
$nearest_distance = null;
$nearest_color = null;
foreach ($palate as $test_color) {
$test_distance = luminanceDistance($test_color, $rgbcolor);
if (isset($nearest_distance)) {
if ($nearest_distance > $test_distance) {
// found a closer color
$nearest_distance = $test_distance;
$nearest_color = $test_color;
}
} else {
$nearest_color = $test_color;
$nearest_distance = $test_distance;
}
}
我知道我需要使用循环来查看 $palette
数组,但我需要帮助进行颜色比较。
目标是找到 $rgbcolor
最接近 $palette
的值,并显示与 $palette
.
<?php
//input color
$rgbcolor = array(110,84,43);
//listed color
$palette = array(
array(238,216,152),
array(252,216,113),
array(253,217,0),
array(255,208,62),
array(255,182,20),
array(206,137,0),
array(235,169,0),
array(170,137,0),
array(173,132,28),
array(183,131,0),
array(139,120,37),
array(108,86,26)
);
?>
确定颜色“距离”的方法有很多种。
有绝对距离,即各通道值之差之和:
/**
* Find the "naive" difference between two colors.
* @param int[] $color_a Three-element array with R,G,B color values 0-255.
* @param int[] $color_b Three-element array with R,G,B color values 0-255.
* @return int
*/
function absoluteColorDistance(array $color_a, array $color_b): int {
return
abs($color_a[0] - $color_b[0]) +
abs($color_a[1] - $color_b[1]) +
abs($color_a[2] - $color_b[2]);
}
亮度也有差异,这将提供更多与颜色无关的比较:
/**
* Find the difference between two colors' luminance values.
* @param int[] $color_a Three-element array with R,G,B color values 0-255.
* @param int[] $color_b Three-element array with R,G,B color values 0-255.
* @return int
*/
function luminanceDistance(int $color_a, int $color_b): int {
$luminance_f = function ($red, $green, $blue): int {
// Source: https://en.wikipedia.org/wiki/Relative_luminance
$luminance = (int) (0.2126 * $red + 0.7152 * $green + 0.0722 * $blue);
return $luminance;
};
return abs(
$luminance_f($color_a[0], $color_a[1], $color_a[2]) -
$luminance_f($color_b[0], $color_b[1], $color_b[2])
);
}
一旦你弄清楚了如何比较颜色,你需要解决的下一个问题就是找到与你的目标颜色距离最小的颜色:
$nearest_distance = null;
$nearest_color = null;
foreach ($palate as $test_color) {
$test_distance = luminanceDistance($test_color, $rgbcolor);
if (isset($nearest_distance)) {
if ($nearest_distance > $test_distance) {
// found a closer color
$nearest_distance = $test_distance;
$nearest_color = $test_color;
}
} else {
$nearest_color = $test_color;
$nearest_distance = $test_distance;
}
}