Eu precisava escurecer as cores definidas pelo usuário e descobri isso.
Não é muito preciso (para isso mudaria para HSL e mudaria a luminosidade) e não pode clarear a cor, mas atende às minhas necessidades.
Função:
function darken_color($rgb, $darker=2) {
$hash = (strpos($rgb, '#') !== false) ? '#' : '';
$rgb = (strlen($rgb) == 7) ? str_replace('#', '', $rgb) : ((strlen($rgb) == 6) ? $rgb : false);
if(strlen($rgb) != 6) return $hash.'000000';
$darker = ($darker > 1) ? $darker : 1;
list($R16,$G16,$B16) = str_split($rgb,2);
$R = sprintf("%02X", floor(hexdec($R16)/$darker));
$G = sprintf("%02X", floor(hexdec($G16)/$darker));
$B = sprintf("%02X", floor(hexdec($B16)/$darker));
return $hash.$R.$G.$B;
}
Exemplo de uso:
$color = '#45ff33';
$darker = darken_color($color, $darker=2);
echo "$color => $darker";
Para melhores resultados, o valor do segundo parâmetro deve estar entre 1 e 4 e pode ser decimal.