texto - ¿Cómo generar colores más claros/más oscuros con PHP?
strip_tags php ejemplo (5)
Ajustar el color por porcentaje, como en el ejemplo dado por Frxstrem, no es ideal.
Si su color es negro (0,0,0 en RGB), se multiplicará por cero, lo que no producirá ningún cambio. Si su color es de color gris oscuro (por ejemplo, 2,2,2 en RGB), tendrá que aclarar un 50% para pasar a (3,3,3). Por otro lado, si tiene un color RGB de (100,100,100), el ajuste del 50% lo moverá hasta (150,150,150), que es un cambio mucho mayor en comparación.
Una solución mucho mejor sería ajustar por paso / número (0-255) en lugar de por ciento, por ejemplo, como este (código PHP):
Editar 2014-01-06: Limpió el código un poco.
function adjustBrightness($hex, $steps) {
// Steps should be between -255 and 255. Negative = darker, positive = lighter
$steps = max(-255, min(255, $steps));
// Normalize into a six character long hex string
$hex = str_replace(''#'', '''', $hex);
if (strlen($hex) == 3) {
$hex = str_repeat(substr($hex,0,1), 2).str_repeat(substr($hex,1,1), 2).str_repeat(substr($hex,2,1), 2);
}
// Split into three parts: R, G and B
$color_parts = str_split($hex, 2);
$return = ''#'';
foreach ($color_parts as $color) {
$color = hexdec($color); // Convert to decimal
$color = max(0,min(255,$color + $steps)); // Adjust color
$return .= str_pad(dechex($color), 2, ''0'', STR_PAD_LEFT); // Make two char hex code
}
return $return;
}
Tengo un valor hexadecimal de algún color, por ejemplo #202010
.
¿Cómo generar un nuevo color que sea más claro o más oscuro dado en porcentaje (es decir, 20% más oscuro) en PHP?
Aquí hay un ejemplo:
<?php
$color = ''#aabbcc''; // The color we''ll use
Extrae los colores. Preferiría usar expresiones regulares, aunque probablemente también existan otras formas más eficientes.
if(!preg_match(''/^#?([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i'', $color, $parts))
die("Not a value color");
Ahora tenemos el rojo en $parts[1]
, verde en $parts[2]
y azul en $parts[3]
. Ahora, convirtámoslos de hexadecimales en enteros:
$out = ""; // Prepare to fill with the results
for($i = 1; $i <= 3; $i++) {
$parts[$i] = hexdec($parts[$i]);
Luego los disminuiremos en un 20%:
$parts[$i] = round($parts[$i] * 80/100); // 80/100 = 80%, i.e. 20% darker
// Increase or decrease it to fit your needs
Ahora, los volveremos a convertir en hexadecimales y los agregaremos a nuestra cadena de salida
$out .= str_pad(dechex($parts[$i]), 2, ''0'', STR_PAD_LEFT);
}
Luego solo agrega un "#" al comienzo de la cadena, ¡y listo!
Estaba interesado en esto, pero mi pregunta era ¿cómo puedo agregar una opacidad a un color?
Quería que un color se desvaneciera, no se hiciera más claro. Encontré esto: http://www.gidnetwork.com/b-135.html y funcionó muy bien: código publicado desde el sitio original para lectores de SO.
function color_blend_by_opacity( $foreground, $opacity, $background=null )
{
static $colors_rgb=array(); // stores colour values already passed through the hexdec() functions below.
$foreground = str_replace(''#'','''',$foreground);
if( is_null($background) )
$background = ''FFFFFF''; // default background.
$pattern = ''~^[a-f0-9]{6,6}$~i''; // accept only valid hexadecimal colour values.
if( !@preg_match($pattern, $foreground) or !@preg_match($pattern, $background) )
{
trigger_error( "Invalid hexadecimal colour value(s) found", E_USER_WARNING );
return false;
}
$opacity = intval( $opacity ); // validate opacity data/number.
if( $opacity>100 || $opacity<0 )
{
trigger_error( "Opacity percentage error, valid numbers are between 0 - 100", E_USER_WARNING );
return false;
}
if( $opacity==100 ) // $transparency == 0
return strtoupper( $foreground );
if( $opacity==0 ) // $transparency == 100
return strtoupper( $background );
// calculate $transparency value.
$transparency = 100-$opacity;
if( !isset($colors_rgb[$foreground]) )
{ // do this only ONCE per script, for each unique colour.
$f = array( ''r''=>hexdec($foreground[0].$foreground[1]),
''g''=>hexdec($foreground[2].$foreground[3]),
''b''=>hexdec($foreground[4].$foreground[5]) );
$colors_rgb[$foreground] = $f;
}
else
{ // if this function is used 100 times in a script, this block is run 99 times. Efficient.
$f = $colors_rgb[$foreground];
}
if( !isset($colors_rgb[$background]) )
{ // do this only ONCE per script, for each unique colour.
$b = array( ''r''=>hexdec($background[0].$background[1]),
''g''=>hexdec($background[2].$background[3]),
''b''=>hexdec($background[4].$background[5]) );
$colors_rgb[$background] = $b;
}
else
{ // if this FUNCTION is used 100 times in a SCRIPT, this block will run 99 times. Efficient.
$b = $colors_rgb[$background];
}
$add = array( ''r''=>( $b[''r'']-$f[''r''] ) / 100,
''g''=>( $b[''g'']-$f[''g''] ) / 100,
''b''=>( $b[''b'']-$f[''b''] ) / 100 );
$f[''r''] += intval( $add[''r''] * $transparency );
$f[''g''] += intval( $add[''g''] * $transparency );
$f[''b''] += intval( $add[''b''] * $transparency );
return sprintf( ''%02X%02X%02X'', $f[''r''], $f[''g''], $f[''b''] );
}
Las respuestas son incorrectas
Usar el modelo RGB es un error conceptual.
Necesita transformar el color de RGB (o forma hexadecimal) en HSL.
Eso es Hue, Saturación, Luminosidad.
Una vez que lo convierte de RGB a HSL, para aclarar el color, simplemente ajuste el valor L (luminosidad) en un 10%. Luego, una vez que terminas, conviertes de HSL a RGB y ya has terminado.
Voila!
https://github.com/mikeemoo/ColorJizz-PHP permite convertir a HSL, cambiar el componente de claridad y volver a convertir a RGB.