Estoy bastante seguro de que no hay funciones en PHP que puedan manejar el cambio de matiz. Sin embargo, usted puede escribir su propia función para hacer esto, aquí están los pasos para cambiar la tonalidad de la imagen:
- Traverse la imagen píxel a píxel
- obtener el color RGB en el píxel utilizando imagecolorat()
- Transformar el RGB valor en un valor HSL
- Cambiar el valor de matiz, saturación y luminosidad dejar solos (Hue es un valor de 0 a 360)
- Transformar el nuevo valor HSL de nuevo a RGB
- Cambiar el color en el píxel actual
En realidad, esto parece ser algo muy interesante de probar, así que podría hacerlo yo mismo y publicarlo aquí si no encuentra otra solución.
EDITAR
Has escrito la función. Para cambiar el tono en PHP, necesitará funciones para transformar espacios de color RGB y HSL y una función que atraviese la imagen. Esto podría ser un poco feo, pero funciona muy bien. Bastante lento en imágenes más grandes.
function imagehue(&$image, $angle) {
if($angle % 360 == 0) return;
$width = imagesx($image);
$height = imagesy($image);
for($x = 0; $x < $width; $x++) {
for($y = 0; $y < $height; $y++) {
$rgb = imagecolorat($image, $x, $y);
$r = ($rgb >> 16) & 0xFF;
$g = ($rgb >> 8) & 0xFF;
$b = $rgb & 0xFF;
$alpha = ($rgb & 0x7F000000) >> 24;
list($h, $s, $l) = rgb2hsl($r, $g, $b);
$h += $angle/360;
if($h > 1) $h--;
list($r, $g, $b) = hsl2rgb($h, $s, $l);
imagesetpixel($image, $x, $y, imagecolorallocatealpha($image, $r, $g, $b, $alpha));
}
}
}
He aquí las funciones auxiliares requeridas para la conversión de espacio de color, descaradamente copiado de http://www.actionscript.org/forums/showthread.php3?t=50746 con alteraciones menores:
function rgb2hsl($r, $g, $b) {
$var_R = ($r/255);
$var_G = ($g/255);
$var_B = ($b/255);
$var_Min = min($var_R, $var_G, $var_B);
$var_Max = max($var_R, $var_G, $var_B);
$del_Max = $var_Max - $var_Min;
$v = $var_Max;
if ($del_Max == 0) {
$h = 0;
$s = 0;
} else {
$s = $del_Max/$var_Max;
$del_R = ((($var_Max - $var_R)/6) + ($del_Max/2))/$del_Max;
$del_G = ((($var_Max - $var_G)/6) + ($del_Max/2))/$del_Max;
$del_B = ((($var_Max - $var_B)/6) + ($del_Max/2))/$del_Max;
if ($var_R == $var_Max) $h = $del_B - $del_G;
else if ($var_G == $var_Max) $h = (1/3) + $del_R - $del_B;
else if ($var_B == $var_Max) $h = (2/3) + $del_G - $del_R;
if ($h < 0) $h++;
if ($h > 1) $h--;
}
return array($h, $s, $v);
}
function hsl2rgb($h, $s, $v) {
if($s == 0) {
$r = $g = $B = $v * 255;
} else {
$var_H = $h * 6;
$var_i = floor($var_H);
$var_1 = $v * (1 - $s);
$var_2 = $v * (1 - $s * ($var_H - $var_i));
$var_3 = $v * (1 - $s * (1 - ($var_H - $var_i)));
if ($var_i == 0) { $var_R = $v ; $var_G = $var_3 ; $var_B = $var_1 ; }
else if ($var_i == 1) { $var_R = $var_2 ; $var_G = $v ; $var_B = $var_1 ; }
else if ($var_i == 2) { $var_R = $var_1 ; $var_G = $v ; $var_B = $var_3 ; }
else if ($var_i == 3) { $var_R = $var_1 ; $var_G = $var_2 ; $var_B = $v ; }
else if ($var_i == 4) { $var_R = $var_3 ; $var_G = $var_1 ; $var_B = $v ; }
else { $var_R = $v ; $var_G = $var_1 ; $var_B = $var_2 ; }
$r = $var_R * 255;
$g = $var_G * 255;
$B = $var_B * 255;
}
return array($r, $g, $B);
}
Y, por último, un ejemplo de uso. En este ejemplo se abre una imagen, cambia su color por 180 ° y salidas al navegador:
header('Content-type: image/png');
$image = imagecreatefrompng('image.png');
imagehue($image, 180);
imagepng($image);
A medida que el ángulo de tono se establece en grados, dando 0, 360, 720 o cualquier múltiplo de 360 dará lugar a ningún cambiar a la imagen.
¿Qué función cree que está 'repintando completamente la imagen'? ¿Qué quieres decir con 'pierde el diseño'? –
¿Cuántas preguntas va a publicar y eliminar con respecto a la función set_theme_color_header()? –