0

一个关于 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 可能的代码,以使相同的色调更暗/更亮。

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

4

2 回答 2

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。

于 2011-02-27T21:46:55.577 回答
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
于 2011-02-27T21:46:04.140 回答