如何通过PHP简单轻松地改变单个rgb颜色的亮度?

时间:2011-02-27 21:20:05

标签: colors rgb color-scheme hsl

关于RGB颜色的问题,找到最简单,最简单的PHP转换代码,用于处理给定RGB色调的亮度/暗度。

想象一个变量$colorA包含一个有效的六个字符RGB颜色,比如F7A100,我们希望它们更轻和/或更暗:

$color  = B1B100;                     // original RGB color manually set.

然后,在任何页面上,颜色都会变得更暗/更轻:

$colorX = someFunction($color, +10);  // original color 10 steps lighter
$colorY = someFunction($color, -25);  // original color 25 steps darker

你的解决方法是什么?保持RGB原样或首先将其更改为HSL?欢迎提示和建议。您的样品/代码也是受欢迎的。

这真正关注TINIES / SIMPLES / SHORTEST可能的代码,使相同的色调位更暗/更亮。

我故意不建议我的代码,因为我想在这里保持可能性。

2 个答案:

答案 0 :(得分:4)

绝对最简单的解决方案是在颜色表示的每个部分添加一些常量(如1):[R, G, B]。这是因为所有[R, G, B]的最大值代表白色,而最小值代表黑色。在伪代码中(假设255是最大值,抱歉,我不知道PHP):

lighter(R, G, B) = [
    min(255, R + 1), 
    min(255, G + 1), 
    min(255, B + 1)
]

你必须记住,虽然这种转换过于简单化,正确的实现方式是转换为HSL / HSB,增加H并转换回RGB。

答案 1 :(得分:2)

对于亮度的轻微更改,您可以将十六进制值转换为十进制,操纵它们并转换回十六进制,如下所示:

function alterBrightness($color, $amount) {
    $rgb = hexdec($color); // convert color to decimal value

    //extract color values:
    $red = $rgb >> 16;
    $green = ($rgb >> 8) & 0xFF;
    $blue = $rgb & 0xFF;

    //manipulate and convert back to hexadecimal
    return dechex(($red + $amount) << 16 | ($green + $amount) << 8 | ($blue + $amount));
}

echo alterColor('eeeeee', -10); //outputs e4e4e4

请注意,此代码不会处理一种颜色的溢出 - 如果一个颜色值小于0或大于255,则会得到无效的颜色值。这应该很容易添加。

如果亮度发生剧烈变化,请转换为HSL并操纵亮度。

使用Drupal代码中的函数,可以这样做:

$hsl = _color_rgb2hsl(_color_unpack('eeeeee'));
$hsl[2] -= 10;
$rgb = _color_pack(_color_hsl2rgb($hsl));
echo $rgb;  //outputs e4e4e4