Ver Mensaje Individual
  #1 (permalink)  
Antiguo 27/04/2006, 01:27
Molxa
 
Fecha de Ingreso: enero-2005
Mensajes: 63
Antigüedad: 19 años, 3 meses
Puntos: 1
Pregunta Redimensionar gif animados con libreria GD o con lo que sea

Hola a todos

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 (=> 'GIF'=> 'JPG'=> '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]-10);
$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_img00);
$ptl_over_black =  imagecolorat($dst_img$x-1,  0);
$pbr_over_black =  imagecolorat($dst_img0$y-1);
$pbl_over_black =  imagecolorat($dst_img$x-1,  $y-1);

// Buscar  pixel con  color blanco
$bg =  imagecolorallocate($dst_img255255255);
imagefilledrectangle($dst_img00$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_img00);
$ptl_over_white =  imagecolorat($dst_img$x-1,  0);
$pbr_over_white =  imagecolorat($dst_img0$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_img00$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_img00$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_img00$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_img00$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_finaloctdec('777')); 

?>