【问题标题】:How to map a range of hex values to a color如何将一系列十六进制值映射到颜色
【发布时间】:2016-12-19 19:25:02
【问题描述】:

我需要获取图像中最主要的颜色,并成功找到对应的十六进制值(RGB)。接下来是将十六进制值映射常用颜色(如红色、黄色、绿色、蓝色、紫色、粉色、白色、灰色、黑色、棕色 等)。所以基本上我需要的是一种将十六进制范围值映射到特定颜色的方法。 例如#ff5050、#ff1a1a、#e60000 等都是红色的。因此,如果将 #ff5050 作为输入,则结果必须为 red。这样,所有十六进制值都必须与上面提到的一些常见颜色相匹配。 怎样才能做到这一点?

我比较喜欢的编程语言是php。

【问题讨论】:

标签: php colors rgb


【解决方案1】:

您可以在 PHP 中获取图片直方图。您可以在此处找到更多信息和代码示例:http://php.net/manual/en/imagick.getimagehistogram.php

要将您的颜色映射到 html 名称,您可以遍历颜色数组并使用您正在寻找的颜色计算颜色距离。距离最小的颜色会给出最好的 html 名称。你可以在这里找到更多关于颜色距离的资源:@​​987654322@

每次处理每张新图片时都可能需要大量时间,因此更好的解决方案: 您处于 RGB 颜色空间中。这意味着您有 256x256x256 种不同的颜色。每种颜色都由 RGB 坐标定义 - http://www.w3schools.com/colors/colors_names.asp。例如,“aqua”具有 RGB 坐标 (0,255,255)。您的目标是通过名称命名 RGB 空间中的所有颜色,但您不需要为 RGB 空间中非常单一的颜色提供唯一名称,因为您无法通过眼睛区分每个细节(例如 (0,0,1) 和(0,0,2) 看起来一样)。因此,您可以指定所需的颜色名称列表:

$colorNames = array(
  [0] => 'white', //#FFFFFF
  [1] => 'red',   //#FF0000
  ...
);

现在,为了快速将由坐标 (r,g,b) 给出的颜色 C 映射到颜色名称,您必须查找 $colorNames 数组中的索引对应于颜色 C。为此,您可以提前准备一个文件,其大小为 256*256*256 = 16MB。每个字节代表 RGB 空间中的一个点。字节的值是颜色在 $colorNames 数组中与颜色最相似的索引。如何创建文件(伪代码):

for every value of R coordinate
    for every value of G coordinate
        for every value of B coordinate
            find which color name in $colorName has the smallest distance to coordinates (R,G,B) 
            store the index for this color name to file

现在你有了一个包含任何颜色的所有索引的文件。这意味着您现在所要做的,就是将任何颜色映射到名称,只需在该文件中读取一个字节,然后在数组中查找颜色名称。

open mapping file
read one byte on position (R*256*256 + G*256 + B)
this byte is the 'index' in colorNames array
read the color name (colorNames['index'])

【讨论】:

  • 我想将一系列十六进制映射到颜色,而不是相反
【解决方案2】:

或更多的工程方法。将 RGB 空间划分为 8 个子空间并进行颜色名称近似。然后你只需要找出你的颜色在哪个子空间中。

$colorNames = array(
      array(
          array(
            'black', // 0 0 0
            'blue'   // 0 0 1
          ),
          array(
            'green', // 0 1 0 
            'cyan'   // 0 1 1
          )
      ),
      array(
          array(
            'red',   // 1 0 0
            'violet' // 1 0 1
          ),
          array(
            'yellow',// 1 1 0 
            'white'  // 1 1 1
          )
      )
  );

function GetColorName($r, $g, $b)
{
    global $colorNames;
    echo $r_appx = (int)($r/0x80);
    echo $g_appx = (int)($g/0x80);
    echo $b_appx = (int)($b/0x80);

    return $colorNames[$r_appx][$g_appx][$b_appx];
}

echo GetColorName(0xAA,0x40,0x40); // red
echo GetColorName(0x40,0xAA,0x40); // green
echo GetColorName(0x40,0x40,0xAA); // blue
echo GetColorName(0xAA,0x40,0xAA); // violet
echo GetColorName(0xAA,0xAA,0x40); // yellow
echo GetColorName(0x00,0xAA,0xAA); // cyan
echo GetColorName(0x40,0x40,0x40); // black
echo GetColorName(0xAA,0xAA,0xAA); // white

同样,如果您需要更多颜色,您可以轻松地将 RGB 空间划分为 27 个子空间。

【讨论】:

    猜你喜欢
    • 2018-05-04
    • 1970-01-01
    • 2010-11-19
    • 2016-06-08
    • 2015-04-19
    • 2019-06-16
    • 2021-03-08
    • 1970-01-01
    • 2019-07-30
    相关资源
    最近更新 更多