检测颜色是否在范围内

Jac*_*ies 5 php

可能重复:
PHP中颜色之间的"距离"

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

sle*_*man 11

它对我来说看起来相当线性.但是,您需要了解一些色彩理论.

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

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

                                          Red
       Red                        Orange   |   Purple
        |                                \_|_/
       _o_        ---------->             _o_
      /   \                              / | \
  Yellow   Blue                   Yellow   |   Blue
                                         Green
Run Code Online (Sandbox Code Playgroud)

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

        Magenta
     Red   |   Blue
         \_|_/
          _o_
         / | \
  Yellow   |   Cyan
         Green
Run Code Online (Sandbox Code Playgroud)

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

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

        Magenta                 Magenta
     Red   |   Blue                |           Red     Blue
         \_|_/                     |              \_ _/
          _o_            ==       _o_       +       o
         / | \                   /   \              |
  Yellow   |   Cyan         Yellow    Cyan          |
         Green                                    Green
Run Code Online (Sandbox Code Playgroud)

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

rgb(100,80,10)  is a "yellowish" version of rgb(100,80,120)
            ^                                           ^
Run Code Online (Sandbox Code Playgroud)

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

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

rgb(255,182,193)
Run Code Online (Sandbox Code Playgroud)

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

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

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

因此,要获得接近目标颜色的阴影,我们需要:

  1. R值显着高于G或B.
  2. 所有值都很高(大约150左右).

通过这个定义我们可以将粉红色识别为:

// 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;
}
Run Code Online (Sandbox Code Playgroud)

我们可以通过确保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
}
Run Code Online (Sandbox Code Playgroud)

您可以调整值200,150和20以适合您的粉红色味道,但是如果我们将上述功能应用于您的测试颜色(255,182,193)并且(238,162,173)它们都被识别为"粉红色" ,您将看到.