2KB项目,专业的源码交易网站 帮助 收藏 每日签到

怎么盘算互补的色彩(RGB / HSL转换)

  • 时间:2019-03-14 18:17 编辑:2KB 来源:2KB.COM 阅读:438
  • 扫一扫,手机访问
  • 分享
摘要: 英文原文:How
英文原文:How to Calculate a Complementary Colour (Inc. RGB / HSL Conversion) 当我在写色彩盘算器时,在寻觅相干信息比方公式等方面我碰到一些艰苦,在这里记载一下。

假如你在谷歌搜刮过,你应当看到过如许一个说法:你可以经过从FF减去一个色彩的十六进制对盘算出该色彩的补色,但假如你在色盘上反省后果的话,你会觉察后果不合错误或只要某些色彩是对的。

互补色是色盘上相互绝对的色彩,所以盘算的最容易的办法是将它们转换到一个基于色盘的符号系统,例如,HSL,假如你曾经熟习HSL的话间接跳到下面盘算的部分。

关于HSL(色彩、饱和度、亮度)

HSL代表色彩、饱和度和亮度,每一个属性值运用一个数字量化。

色彩是颜色绝对色轮的地位,以度为单元从0°到359°,代表轮一周的360°,0°是白色,白色180°相反的色彩是青色,等等。

饱和度是色彩暗淡或亮堂的强度。饱和度越低,色彩看起来越黯(灰色)。饱和度用百分数表现,100%是完整饱和的,最亮的,0%是完整不饱和灰色的。

亮度代表色彩的光明水平,和饱和度略有分歧。越白的色彩的亮度值越高,越黑,亮度值越低。所以100%的亮度的色彩是白色,0%是玄色,“纯”色是50%的亮度。

经过看来比拟饱和度和亮度之间的差别比说明它更轻易,假如你想弄明白,碰运气看colour calculator上的亮度和饱和度变更比拟图,选择一个亮的色彩作为你的启动器的色彩。

所以HSL标志系统看起来像如许,按色彩、饱和度和亮度的次序:

白色: 0° 100% 50% 
单粉色: 0° 100% 90% 

青色: 180° 100% 50%

盘算步调

1. 将你的色彩转换到HSL. 

2. 取色彩值相反值(比方,假如色彩是50°,相反值是230°-轮上转180°)。

3. 饱和度和亮度坚持稳定。 

4. 将转换后的HSL值处置会本来的色彩表现(RGB或此外甚么)。

所以如今我们只需求将色彩转换到HSL的公式,easyrgb.com有人给的在这里,运用“通用”代码描绘,如许你可以转化为你选用言语。

PHP 例程

这是我的例程,用 PHP 盘算一个十六进制色彩代码的互补色彩值。你可以在你本人的顺序中让这段 PHP 代码更简练和有效力,这个例程成心把处置分化成一些容易的步调,以便让读者更轻易清楚其道理。

我们转换RGB到HSL的公式需求三个十进制的1的分数作为它的输出。如,一个RGB值255 255 255将输出为1 1 1,RGB值153 051 255将输出为0.6,0.2,1。

所以起首,失掉这类输出格局的6个十六进制数字位:
    // $hexcode 是我们要转换的十六进制色彩代码的六个数字位。
    $redhex  = substr($hexcode,0,2);
    $greenhex = substr($hexcode,2,2);
    $bluehex = substr($hexcode,4,2);

    // $var_r, $var_g 和 $var_b 是盘算出的三个十进种柿魁,将作为我们 RGB-to-HSL 转换子顺序的输出参数。
    $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);
    $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);
	}
	else
	{
		$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));
};

// 转换色彩为 RGB 的函数,被上面代码挪用。

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);
};
在这些顺序以后,我们终极在 $r,$g 和 $b 中有了 255 255 255 格局的RGB值,我们可以把它们转换成十六进制的六个数字位,以下:
$rhex = sprintf("%02X",round($r));
$ghex = sprintf("%02X",round($g));
$bhex = sprintf("%02X",round($b));

$rgbhex = $rhex.$ghex.$bhex;
$rgbhex 就是我们终极的谜底——十六进制的互补色值。 本文中的一切译文仅用于进修和交换目标,转载请务必注明文章译者、出处、和本文链接。 2KB翻译任务按照 CC 协定,假如我们的任务有进犯到您的权益,请实时联络我们。


2KB项目(www.2kb.com,源码交易平台),提供担保交易、源码交易、虚拟商品、在家创业、在线创业、任务交易、网站设计、软件设计、网络兼职、站长交易、域名交易、链接买卖、网站交易、广告买卖、站长培训、建站美工等服务

  • 全部评论(0)
资讯详情页最新发布上方横幅
最新发布的资讯信息
【计算机/互联网|】Nginx出现502错误(2020-01-20 21:02)
【计算机/互联网|】网站运营全智能软手V0.1版发布(2020-01-20 12:16)
【计算机/互联网|】淘宝这是怎么了?(2020-01-19 19:15)
【行业动态|】谷歌关闭小米智能摄像头,因为窃听器显示了陌生人家中的照片(2020-01-15 09:42)
【行业动态|】据报道谷歌新闻终止了数字杂志,退还主动订阅(2020-01-15 09:39)
【行业动态|】康佳将OLED电视带到美国与LG和索尼竞争(2020-01-15 09:38)
【行业动态|】2020年最佳AV接收机(2020-01-15 09:35)
【行业动态|】2020年最佳流媒体设备:Roku,Apple TV,Firebar,Chromecast等(2020-01-15 09:31)
【行业动态|】CES 2020预览:更多的流媒体服务和订阅即将到来(2020-01-08 21:41)
【行业动态|】从埃隆·马斯克到杰夫·贝佐斯,这30位人物定义了2010年代(2020-01-01 15:14)
联系我们

Q Q: 7090832

电话:400-0011-990

邮箱:7090832@qq.com

时间:9:00-23:00

联系客服
商家入住 服务咨询 投拆建议 联系客服
0577-67068160
手机版

扫一扫进手机版
返回顶部