既然您提到您的背景是固定的,则球的颜色仍然可以是随机的,但是它们必须落在一定范围内,仍然与背景互补。
基本。在我们这样做之前,您需要了解基础知识。考虑以下颜色:
Black #000000 rgb(0,0,0)
Red #FF0000 rgb(255,0,0)
Green #00FF00 rgb(0,255,0)
Blue #0000FF rgb(0,0,255)
Yellow #FFFF00 rgb(255,255,0)
Cyan #00FFFF rgb(0,255,255)
Pink #FF00FF rgb(255,0,255)
Gray #C0C0C0 rgb(192,192,192)
White #FFFFFF rgb(255,255,255)
颜色混合RGB [(0..255),(0..255),(0..255)]会如上所述创建新颜色。
计算负色计算负色就像将红色转换为青色,将绿色转换为紫色,将蓝色转换为黄色一样。
Red #FF0000 rgb(255,0,0) -> Cyan #00FFFF rgb(0,255,255)
Green #00FF00 rgb(0,255,0) -> Purple #FF00FF rgb(255,0,255)
Blue #0000FF rgb(0,0,255) -> Yellow #FFFF00 rgb(255,255,0)
互补色
根据有关计算补色的参考:http : //serennu.com/colour/rgbtohsl.php
关于HSL
HSL用色相,饱和度和亮度来表示颜色,并为颜色的这三个属性分别指定一个数字。
色相是指色轮在色轮上的位置,以0°至359°的度数表示,代表色轮的360°;0°是红色,180°是红色的与青色相反的颜色,依此类推。
饱和度是颜色的强度,它是多么暗淡或明亮。饱和度越低,颜色看起来越暗(灰色)。它以百分比表示,其中100%为完全饱和(最亮),0%为不饱和(灰色)。
亮度是颜色的亮度。与饱和度略有不同。颜色越白,其“亮度”值越高,则黑越多,其“亮度”越低。因此100%亮度将颜色变成白色,0%亮度将颜色变成黑色,而“纯”颜色将是50%亮度。
看到“饱和度”和“亮度”之间的区别比解释它容易得多。如果要澄清,请尝试在颜色计算器页面上查看“亮度”和“饱和度”变化,选择相当明亮的颜色作为起始色。
因此,HSL表示法看起来像这样,按以下顺序给出了“色相”,“饱和度”和“亮度”值:
红色:0°100%50%浅粉色:0°100%90%青色:180°100%50%以下是步骤:
将您的颜色转换为HSL。
将“色相”值更改为相反的色相值(例如,如果您的“色相”为50°,则相反的色相将在方向盘上为230°,在更远处为180°)。
保持“饱和度”和“亮度”值不变。
将此新的HSL值转换回原始颜色表示法(RGB或其他颜色)。
EasyRGB.com等网站可以为您进行从RGB到HSL的通用转换,反之亦然。
程式设计根据参考在PHP中完成的示例
从RGB转换为HSL
蓝色#0000FF rgb(0,0,255)之上的值可以表示为红色十六进制00 +绿色十六进制00 +蓝色十六进制FF
$redhex = substr($hexcode,0,2);
$greenhex = substr($hexcode,2,2);
$bluehex = substr($hexcode,4,2);
也可以表示为红色十进制0 +绿色十进制0 +蓝色十进制255
$var_r = (hexdec($redhex)) / 255;
$var_g = (hexdec($greenhex)) / 255;
$var_b = (hexdec($bluehex)) / 255;
现在,将这些值插入到rgb2hsl例程中。以下是我的EasyRGB.com通用代码的PHP版本:
输入是上面的输入$ var_r,$ var_g和$ var_b输出是等效于$ h,$ s和$ l的HSL-它们再次表示为1的分数,如输入值
$var_min = min($var_r,$var_g,$var_b);ttt
$var_max = max($var_r,$var_g,$var_b);
$del_max = $var_max - $var_min;
$l = ($var_max + $var_min) / 2;
if ($del_max == 0)
{
$h = 0;
$s = 0;
}
else
{
if ($l < 0.5)
{
$s = $del_max / ($var_max + $var_min);
}
else
{
$s = $del_max / (2 - $var_max - $var_min);
};
$del_r = ((($var_max - $var_r) / 6) + ($del_max / 2)) / $del_max;
$del_g = ((($var_max - $var_g) / 6) + ($del_max / 2)) / $del_max;
$del_b = ((($var_max - $var_b) / 6) + ($del_max / 2)) / $del_max;
if ($var_r == $var_max)
{
$h = $del_b - $del_g;
}
elseif ($var_g == $var_max)
{
$h = (1 / 3) + $del_r - $del_b;
}
elseif ($var_b == $var_max)
{
$h = (2 / 3) + $del_g - $del_r;
};
if ($h < 0)
{
$h += 1;
};
if ($h > 1)
{
$h -= 1;
};
};
因此,现在我们在变量$ h,$ s和$ l中将颜色作为HSL值。在此阶段,这三个输出变量再次保持为1的分数,而不是度和百分比。因此,例如,青色(180°100%50%)将显示为$ h = 0.5,$ s = 1和$ l = 0.5。
接下来找到相反色相的值,即相距180°或0.5的色相(我敢肯定,数学家有一种更优雅的方法做到这一点,但是):
计算相反的色相$ h2
$h2 = $h + 0.5;
if ($h2 > 1)
{
$h2 -= 1;
};
补色的HSL值现在为$ h2,$ s,$ l。因此,我们已经准备好将其转换回RGB(同样,这是EasyRGB.com公式的PHP版本)。请注意,这次输入和输出格式有所不同,请参见代码顶部的注释:
输入是补色的HSL值,以$ h2,$ s,$ l的1的分数保存。输出是标准255 255 255格式的RGB,以$ r,$ g,$ b保留。使用功能hue_2_rgb转换色相,如下所示在此代码的末尾
if ($s == 0)
{
$r = $l * 255;
$g = $l * 255;
$b = $l * 255;
}
else
{
if ($l < 0.5)
{
$var_2 = $l * (1 + $s);
}
elset
{
$var_2 = ($l + $s) - ($s * $l);
};
$var_1 = 2 * $l - $var_2;
$r = 255 * hue_2_rgb($var_1,$var_2,$h2 + (1 / 3));
$g = 255 * hue_2_rgb($var_1,$var_2,$h2);
$b = 255 * hue_2_rgb($var_1,$var_2,$h2 - (1 / 3));
};
// Function to convert hue to RGB, called from above
function hue_2_rgb($v1,$v2,$vh)
{
if ($vh < 0)
{
$vh += 1;
};
if ($vh > 1)
{
$vh -= 1;
};
if ((6 * $vh) < 1)
{
return ($v1 + ($v2 - $v1) * 6 * $vh);
};
if ((2 * $vh) < 1)
{
return ($v2);
};
if ((3 * $vh) < 2)
{
return ($v1 + ($v2 - $v1) * ((2 / 3 - $vh) * 6));
};
return ($v1);
};
在执行完该例程后,我们终于有了255255255(RGB)格式的$ r,$ g和$ b,可以将其转换为六位数的十六进制:
$rhex = sprintf("%02X",round($r));
$ghex = sprintf("%02X",round($g));
$bhex = sprintf("%02X",round($b));
$rgbhex = $rhex.$ghex.$bhex;
$ rgbhex是我们的答案-十六进制中的互补色。
由于您的颜色背景是蓝色或0,0,255,因此HSL为
色相(H):240度/饱和度(S):100%/亮度(L):4.9%
240的对面是60,然后转回RGB,则值为#181800