从颜色数组中查找最匹配的RGB颜色

问题描述 投票:0回答:1

我知道我需要使用循环来查看$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)
  );
?>
php rgb
1个回答
3
投票

有许多不同的方法来确定颜色“距离”。

存在绝对距离,即每个通道值之间的差之和:

function absoluteColorDistance($color_a, $color_b) {
    return
        abs($color_a[0] - $color_b[0]) +
        abs($color_a[1] - $color_b[1]) +
        abs($color_a[2] - $color_b[2]);
}

亮度方面也有差异,这将提供更多颜色独立的比较:

function luminanceDistance($color_a, $color_b) {
    $luminance_f = function ($red, $green, $blue) {
        // 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;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.