Después de millones de búsquedas en este foro, tutoriales varios y dolores de cabeza este es el código que he construido para redimensionar gif y gif que sean transparentes usando la librería GD v. 2.0.x, pero soy incapaz de redimensionar gif animados y que conserven la información de la animación, se redimensiona como si fuera un gif normal. ¿Qué hago mal...? Igual no se pueden redimensionar gif animados....
Código PHP:
<?
// Aplicación para redimensionar imágenes gif normales y trasparentes usando librería GD.
/*
imagen_fuente: ruta imagen que he subido a través de un formulario.
imagen_final: ruta donde va a ir la imagen ya redimensionada.
$imagen_finalAlto: alto máximo que redimensionamos.
imagen_finalAncho: ancho máximo que redimensionamos.
*/
$imagen_fuente = "../../fotografias/banners/".$_POST['foto'].".gif";
$imagen_final = "../../fotografias/banners/".$_POST['foto']."-R.gif";
$imagen_finalAlto = 125;
$imagen_finalAncho = 150;
$tipo_imagen = array (1 => 'GIF', 2 => 'JPG', 3 => 'PNG');
$info_imagen = getimagesize($imagen_fuente);
$info_imagen[2] = $tipo_imagen[$info_imagen[2]];
// ancho/alto de la imagen fuente
$srcAlto = $info_imagen[0];
$srcAncho = $info_imagen[1];
// Verifica que es GIF
if ($info_imagen[2] == 'GIF'){
$src_img = imagecreatefromgif($imagen_fuente);
}
if (!$src_img) {
$error = "imagen no válida!";
return false;
}
//Ahora vamos a calcular el ancho y el alto que debe tener la imagen final para que se redimensione en proporción.
// determina el tamaño de la imagen
$imx = @ImageSX($src_img);
$imy = @ImageSY($src_img);
//determina proporcion en unidades
$x = $imx/$imagen_finalAlto;
$y = $imy/$imagen_finalAncho;
// calcula la escala
if($x>$y) $scale = $imagen_finalAlto/$imx;
if($x<$y) $scale = $imagen_finalAncho/$imy;
if($x==$y) $scale = $imagen_finalAncho/$imy;
//Escala la imagen
$x = intval($imx*$scale);
$y = intval($imy*$scale);
// Ahora buscamos qué color es transparente en el gif para no mostrarlo.
// Buscar Pixels esquina
$tr_color = imagecolorat($src_img, 0, 0);
$tl_color = imagecolorat($src_img, $info_imagen[0]-1, 0);
$br_color = imagecolorat($src_img, 0, $info_imagen[1]-1);
$bl_color = imagecolorat($src_img, $info_imagen[0]-1, $info_imagen[1]-1);
$dst_img = imagecreate($x, $y);
// Buscar pixel con color negro
imagepalettecopy($dst_img, $src_img);
imagecopyresampled($dst_img, $src_img, 0, 0, 0, 0, $x, $y, $info_imagen[0], $info_imagen[1]);
$ptr_over_black = imagecolorat($dst_img, 0, 0);
$ptl_over_black = imagecolorat($dst_img, $x-1, 0);
$pbr_over_black = imagecolorat($dst_img, 0, $y-1);
$pbl_over_black = imagecolorat($dst_img, $x-1, $y-1);
// Buscar pixel con color blanco
$bg = imagecolorallocate($dst_img, 255, 255, 255);
imagefilledrectangle($dst_img, 0, 0, $x, $y, $bg);
imagecopyresampled($dst_img, $src_img, 0, 0, 0, 0, $x, $y, $info_imagen[0], $info_imagen[1]);
$ptr_over_white = imagecolorat($dst_img, 0, 0);
$ptl_over_white = imagecolorat($dst_img, $x-1, 0);
$pbr_over_white = imagecolorat($dst_img, 0, $y-1);
$pbl_over_white = imagecolorat($dst_img, $x-1, $y-1);
//Comparar los pixeles para buscar el transparente y asignar ese color como trasparente para que el gif salga transparente.
if($ptr_over_black != $ptr_over_white){
imagefilledrectangle($dst_img, 0, 0, $x, $y, $tr_color);
imagecopyresampled($dst_img, $src_img, 0, 0, 0, 0, $x, $y, $info_imagen[0], $info_imagen[1]);
imagecolortransparent($dst_img, $tr_color);
}
elseif($ptl_over_black != $ptl_over_white){
imagefilledrectangle($dst_img, 0, 0, $x, $y, $tl_color);
imagecopyresampled($dst_img, $src_img, 0, 0, 0, 0, $x, $y, $info_imagen[0], $info_imagen[1]);
imagecolortransparent($dst_img, $tl_color);
}
elseif($pbr_over_black != $pbr_over_white){
imagefilledrectangle($dst_img, 0, 0, $x, $y, $br_color);
imagecopyresampled($dst_img, $src_img, 0, 0, 0, 0, $x, $y, $info_imagen[0], $info_imagen[1]);
imagecolortransparent($dst_img, $br_color);
}
elseif($pbl_over_black != $pbl_over_white){
imagefilledrectangle($dst_img, 0, 0, $x, $y, $bl_color);
imagecopyresampled($dst_img, $src_img, 0, 0, 0, 0, $x, $y, $info_imagen[0], $info_imagen[1]);
imagecolortransparent($dst_img, $bl_color);
}
//Creamos imagen nueva con todos los parametros.
imageinterlace($dst_img,1);
imagegif($dst_img, $imagen_final);
// Borramos imagen de origen
unlink($imagen_fuente);
//borramos caché
imagedestroy($src_img);
imagedestroy($dst_img);
// Se cambian los permisos del archivo para poder manipular la imagen a gusto posteriorimente.
chmod($imagen_final, octdec('777'));
?>