检测颜色是否在范围内

时间:2012-11-23 01:49:45

标签: php

  

可能重复:
  “Distance” between colours in PHP

我想检测RGB值是否是某种粉红色。我不确定如何继续这个,因为似乎没有一系列RGB或十六进制值遵循粉红色的线性顺序(一个粉红色是255, 182, 193; #FFB6C1,而另一个是238, 162, 173; #EEA2AD })。你知道该做什么,你知道我的范围的RGB / hex值的开始和结束吗?

1 个答案:

答案 0 :(得分:11)

对我而言看起来相当线性。但是,你需要了解一些色彩理论。

我希望你在回答你的问题之前不要介意我在这里简单介绍一下色彩理论。但它有助于理解或制定任何解决方案。

首先,我相信大多数人都会记得他们在幼儿园学到的色轮:

                                          Red
       Red                        Orange   |   Purple
        |                                \_|_/
       _o_        ---------->             _o_
      /   \                              / | \
  Yellow   Blue                   Yellow   |   Blue
                                         Green

好吧,我们需要修改一下。因为事实证明红色和蓝色不是真正的原色,因为你可以通过将洋红色与黄色混合来变红,你可以通过将青色与一些红色混合来获得蓝色。因此修改后的色轮使用打印颜色:CMY:

        Magenta
     Red   |   Blue
         \_|_/
          _o_
         / | \
  Yellow   |   Cyan
         Green

这基本上是HSV颜色空间(S通常绘制从车轮的中心到边缘,而V根本没有绘制,但通常可以通过滑块改变)。它源于印刷颜色CMY。那么这怎么能帮助我们使用屏幕颜色RGB?

好吧,如果仔细观察它,你会发现它实际上是打印和屏幕色彩空间的复合体。它实际上描绘了CMY和RGB之间的关系:

        Magenta                 Magenta
     Red   |   Blue                |           Red     Blue
         \_|_/                     |              \_ _/
          _o_            ==       _o_       +       o
         / | \                   /   \              |
  Yellow   |   Cyan         Yellow    Cyan          |
         Green                                    Green

因此,通过理解这个色轮可以理解任何RGB颜色。例如,RGB中没有黄色。但请注意,黄色与蓝色相反。因此,要获得黄色,您可以从颜色中减去蓝色:

rgb(100,80,10)  is a "yellowish" version of rgb(100,80,120)
            ^                                           ^

一旦你理解了使用RGB值的这个色轮更有意义。通过足够的练习,您可以直接用#rrggbb语法编写和编辑颜色,而无需查阅颜色表。

所以,回答你的问题。说你的目标粉红色是:

rgb(255,182,193)

我们知道关于“粉红色”颜色的两件事:

  1. 我们认为它是一种红色。因此,目标颜色具有高红色值(实际上它是最大值)是有道理的。

  2. 我们认为它是一种非常浅的红色。所以非红色组件也很高(150以上)。

  3. 因此,为了使阴影接近我们需要的目标颜色:

    1. R值显着高于G或B.
    2. 所有值都很高(大约150左右)。
    3. 根据这个定义,我们可以将粉红色识别为:

      // Pseudo code:
      
      is_pink (R,G,B) {
          return R > 200 &&  // make sure R is high
                 G > 150 &&  // make sure G & B are relatively high
                 B > 150 &&
                 R > G &&    // make sure G & B are not higher than R
                 R > B;
      }
      

      我们可以通过确保G& G添加另一个条件来拒绝略带蓝色或带绿色的“粉红色”。 B非常相似:

      // Pseudo code:
      
      is_pink (R,G,B) {
          return R > 200 &&
                 G > 150 &&
                 B > 150 &&
                 R > G &&
                 R > B &&
                 abs(G-B) < 20; // make sure it's neither bluish or greenish
      }
      

      您可以调整值200,150和20以适合您的粉红味,但是如果我们将上述功能应用于您的测试颜色(255,182,193)(238,162,173),您会看到都被认定为“粉红色”。