可能重复:
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)
我们知道关于"粉红色"颜色的两件事:
我们认为它是一种红色.因此,目标颜色具有高红色值(实际上它是最大值)是有道理的.
我们认为它是一种非常浅的红色.所以非红色组件也很高(高于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)它们都被识别为"粉红色" ,您将看到.