Как легко и просто изменить яркость одного цвета RGB через php? - PullRequest
0 голосов
/ 28 февраля 2011

Вопрос о цвете 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 ]

4 голосов
/ 28 февраля 2011

Абсолютно простое решение - добавить некоторую константу (например, 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.

2 голосов
/ 28 февраля 2011

Для небольшого изменения яркости вы можете преобразовать шестнадцатеричные значения в десятичные, манипулировать ими и преобразовать обратно в шестнадцатеричные значения следующим образом:

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
...