2009-04-05 20 views

Respuesta

58

si tiene acceso ImageMagick, usted puede hacer esto:

system("convert big.gif -coalesce coalesce.gif"); 
system("convert -size 200x100 coalesce.gif -resize 200x10 small.gif"); 

lo más probable es posible con el plugin ImageMagick si no lo hace tienen sistema() el acceso

NOTA: esto puede crear un tamaño de archivo más grande de una imagen de dimensiones más pequeñas, aunque debido a la coalescencia esencialmente deoptimizing la imagen.

ACTUALIZACIÓN: Si no tiene acceso ImageMagick, que debe ser capaz de utilizar una combinación de los siguientes pasos para cambiar el tamaño de un gif animado (suponiendo que tiene acceso GD):

  1. Detect si la imagen es un gif animado: Can I detect animated gifs using php and gd? (respuesta superior)
  2. Dividir el gif animado en fotogramas individuales: http://www.phpclasses.org/package/3234-PHP-Split-GIF-animations-into-multiple-images.html
  3. Cambiar el tamaño de los fotogramas individuales: http://www.akemapa.com/2008/07/10/php-gd-resize-transparent-image-png-gif/
  4. Recomposite los marcos en un gif animado de nuevo: http://www.phpclasses.org/package/3163-PHP-Generate-GIF-animations-from-a-set-of-GIF-images.html

Esto es definitivamente mucho más intenso que la ruta ImageMagick, pero debe ser técnicamente posible.

Si usted consigue que funcione, por favor, comparta con el mundo!

+0

lo siento, no tienen acceso a ImageMagic. ¿Alguna otra solución? – riad

+0

Publicó una actualización con una serie de pasos usando GD y clases de terceros para que esto ocurra (en teoría). –

+9

Creo que obtuve la teoría sobre cómo trabajar en la práctica: http://forssto.com/gifexample/ –

1

3 carpeta simplemente creat 2.images nombre 1.frame_output 3.resized_frame_output y descarga 2 codificador y decodificador de clase de este enlace de abajo clase 1.Download "GIFDecoder.class.php" de http://phpclasses.elib.com/browse/package/3234.html clase GIFEncoder 2.Download" .class.php" de http://phpclasses.betablue.net/browse/package/3163.html

y luego ejecutar el nombre del script como "resize_animator.php", creat una carga de archivos html & que Disfruta el guión.

..save este script como index.php ..... .......

<html> 
<body> 
<table width="500" border="0" align="center" cellpadding="0" cellspacing="1" bgcolor="#CCCCCC"> 
<tr> 
<form action="resize_animator.php" method="post" enctype="multipart/form-data" > 
<td> 
<table width="100%" border="0" cellpadding="3" cellspacing="1" bgcolor="#FFFFFF"> 
<tr> 
<td align="center"><font face="Tahoma">SELECT ANIMATED FILE</font> 
<input type="file" name="uploadfile" size="20" accept="image/gif"/> 
</td> 
</tr> 
<tr> 
<td align="center"><input type="submit" name="Submit" value="PROCESS ANIMATION" /></td> 
</tr> 
</table> 
</td> 
</form> 
</tr> 
</table> 
</body> 
</html> 

.................. ...... guardar y este script como resize_animator.php ............

<?php 

    require "GIFDecoder.class.php"; 
    include "GIFEncoder.class.php"; 
    $file_name= $_FILES['uploadfile']['name']; 
    $file_ext = substr($file_name, -4); 
    $file_size=($_FILES["uploadfile"]["size"] /1024); 
    if($file_ext=='.gif') 
    { 
if($file_size > 0 && $file_size < 2000) 
    { 
    session_start (); 
     $uploaded_file = $_FILES['uploadfile']['tmp_name']; 
     $fp=file_get_contents($uploaded_file); 

     if ($fp) 
      { 
       $_SESSION['delays'] = Array (); 
       $gif = new GIFDecoder ($fp); 
       $arr = $gif->GIFGetFrames (); 
       $_SESSION [ 'delays' ] = $gif -> GIFGetDelays (); 

       for ($i = 0; $i < count ($arr); $i++) 
       { 
         fwrite (fopen (($i < 10 ? "frame_output/$i$i_frame.gif" : "frame_output/$i_frame.gif"), "wb"), $arr [ $i ]); 
       } 
      } 

     function resize_frames($newwidth,$newheight) 
      { 
        $dir=opendir("frame_output/"); 
        $i=0; 
        while($imgfile=readdir($dir)) 
        { 
         if ($imgfile != "." && $imgfile!="..") 
          { 
             $imgarray[$i]=$imgfile; 
             $uploadedfile = "frame_output/".$imgarray[$i]; 
             $src = imagecreatefromgif($uploadedfile); 
             list($width,$height)=getimagesize($uploadedfile); 
             $tmp=imagecreatetruecolor($newwidth,$newheight); 
             imagecopyresampled($tmp,$src,0,0,0,0,$newwidth,$newheight,$width,$height); 
             $filename = "resized_frame_output/".$imgarray[$i]; 
             imagegif($tmp,$filename,100); 
             imagedestroy($src); 
             imagedestroy($tmp); 
             $i++; 
          } 
        } 
        closedir($dir); 

       if ($dh = opendir ("resized_frame_output/")) 
       { 
        while (false !== ($dat = readdir ($dh))) 
        { 
         if ($dat != "." && $dat != "..") 
         { 
          $frames [ ] = "resized_frame_output/$dat"; 
         } 
        } 
        closedir ($dh); 
       } 

      $gif = new GIFEncoder ($frames,$_SESSION [ 'delays' ],0, 2, 0, 0, 0,"url"); 
      $data = $gif->GetAnimation (); 

      $x='x'; 
      $y='_'; 
      $uploaded_file_name= $_FILES['uploadfile']['name']; 
      $actual_file_name = substr($uploaded_file_name, 0, -4); 
      $file_extention = substr($uploaded_file_name, -4); 
      $new_name=$actual_file_name.$y.$newwidth.$x.$newheight.$file_extention ; 

      //$output_image_name=$newwidth.$x.$newheight; 
      fwrite (fopen ("images/$new_name", "wb"), $data); 
      //remove resized frames from folder 
      //sleep for 1 second 
      // usleep(2000000); 
      $dir = 'resized_frame_output/'; 
      foreach(glob($dir.'*.*') as $v) 
       { 
       unlink($v); 
       } 
     } // end of function resize_frames 


      $gif = new GIFEncoder ($frames,$_SESSION [ 'delays' ],0, 2, 0, 0, 0,"url"); 
      $data = $gif->GetAnimation (); 

      $x='x'; 
      $y='_'; 
      $z='_p'; 
      $uploaded_file_name= $_FILES['uploadfile']['name']; 
      $actual_file_name = substr($uploaded_file_name, 0, -4); 
      $file_extention = substr($uploaded_file_name, -4); 
      $new_name=$actual_file_name.$y.$newwidth.$x.$newheight.$z.$file_extention ; 

      //$output_image_name=$newwidth.$x.$newheight; 
      fwrite (fopen ("images/$new_name", "wb"), $data); 
      //remove resized frames from folder 
      //sleep for 1 second 
      //usleep(2000000); 
      $dir = 'resized_frame_output/'; 
      foreach(glob($dir.'*.*') as $v) 
       { 
       unlink($v); 
       } 
     } // end of function resize_frames 

      resize_frames(110,110); 
      resize_frames(120,160); 
      resize_frames(120,80); 
      resize_frames(128,96); 
      resize_frames(128,128); 
      resize_frames(208,208); 
      resize_frames(208,320); 

      session_destroy(); 

      //usleep(200000); 

      //remove resized frames from folder 
      $dir = 'frame_output/'; 
      foreach(glob($dir.'*.*') as $v) 
       { 
       unlink($v); 
       } 
     echo "<center><h1>Your Animation processing is compleated.</h1></center>"; 
     echo "<center><h2><a href=\"index.php\">BACK TO UPLOAD PAGE</h2></center>"; 
    } //end of file size checker 
else 
{ 
     echo "<center><h2>You Upload a unfit size image .Upload a file within 2000 KB</h2></center>"; 
     echo "<center><h2><a href=\"index.php\">BACK TO UPLOAD PAGE</h2></center>"; 
} 
    } //end of file extention checker 
    else 
    { 
    echo "<center><h2>Uplaod a gif file!</h2></center>"; 
    echo "<center><h2><a href=\"index.php\">BACK TO UPLOAD PAGE</h2></center>"; 
    } 
    ?> 

................. ...... LETS ENJOY ............

descomentar la función usleep para ver la obra sucede en esos folders.its no es necesario pero lo uso para ver la funcionalidad.

+0

Esto no funciona con fotogramas con transparencia. – FidoBoy

2

creo que lo he entendido en la bolsa.

Esta solución no es perfecta y contiene algo de fuerza bruta aquí y allá, pero pude agregar mi script de cambio de tamaño basado en GD/PHP con suficiente funcionalidad para admitir animaciones.

La solución se basa principalmente en las excelentes bibliotecas de software gratuito de Laszlo Zsidi - http://www.phpclasses.org/browse/author/283569.html

Se puede extraer de una demostración rápida y descargar las fuentes de las http://forssto.com/gifexample/ (enlace directo: http://forssto.com/gifexample/gifanimresize.zip)

Problemas conocidos:

  • Transparencia apoyo - esto sería fácil de añadir a esta solución, pero ya que no hav e una necesidad inmediata de esto, me estoy deteniendo aquí.

  • Velocidad de cuadros - por alguna razón desconocida la clase GifEncoder no toma en cuenta las velocidades de cuadro especificados. Voy a necesitar mirar en esto más tarde.

  • Lo que encontrar un archivo GIF de mi conjunto de pruebas que de alguna manera tenían diferentes marcos de tamaño en ella y que la animación no funcionaron correctamente. Todavía hay algunos errores de depuración para hacer entonces .

+0

Hola. Gracias. Intenté tu solución. Modifiqué las fuentes para leer la imagen de una cadena (hágamelo saber si está interesado), pero resultó que WAAAY se ralentizó. Finalmente me di cuenta de que Imagick estaba disponible en el hosting y lo usé en su lugar. – Rolf

1

Todas estas respuestas, excepto a través de ImageMagick, no funcionó para mí. Los scripts en las respuestas anteriores están llenos de errores.

Incluso la instalación de ImageMagick fue difícil de administrar, así que esta es mi experiencia.

Aquí está how to install ImageMagick en windows 7 y xampp 1.7.4.
Nota: Elija 64 bit (para win7), y cuando instale deja marcada la opción "Agregar a la ruta del sistema".

Y luego seguir: http://www.creativearmory.com/tutorials/resize-animated-gifs-with-php-and-imagemagick

que han perdido horas de secuencias de comandos en esta postes, y ImageMagick y este tutorial fue sucessfull en cuestión de minutos.

Y una nota más: mi servidor web tiene ImageMagick por defecto, así que supongo que la mayoría de los servidores también lo tienen.

3

El ejemplo en http://www.php.net/manual/en/imagick.coalesceimages.php cambiará el tamaño de su gif mientras conserva el tiempo de cuadro. Algo que la mayoría de los otros ejemplos no hacen.

Otros ejemplos reconstruir el gif mientras éste le permite modificar los marcos de la imagen.

+0

imagick es el mejor en la manipulación de imágenes complejas. PHP sabe algunos trucos para. – transilvlad

+0

Esa es la solución por la que fui finalmente, probé otras soluciones, pero fueron prohibitivamente lentas. Asegúrate de que tienes Imagick en tu hosting (no es algo tan raro hoy en día) y úsalo. – Rolf

1

Si usted no tiene Imagemagick en su servidor es posible que desee probar esto:

http://www.phpclasses.org/package/7353-PHP-Resize-animations-in-files-of-the-GIF-format.html

La clase es cambiar el tamaño de las animaciones GIF con GD.Primero analiza los cuadros, luego los redimensiona, luego los vuelve a compilar en un solo archivo sin perder sus tiempos de demora, métodos de eliminación, tablas de colores, etc.

Intente si encuentra un error o si desea sugerir algunas optimizaciones, etc. puedes usar el foro de la clase o dejar un comentario en la página de mi sitio web. Y lo responderé lo antes posible.

5

He intentado numerosos ejemplos de cambio de tamaño de GIF animados con el módulo Imagick PHP, pero ninguno de ellos funcionó para mí. Luego, después de algún tiempo de depuración, por fin me encontré con el problema real: la animación se perdió al guardar la imagen en el disco, por $animation->writeImage($file_dst); o $animation->writeImages($file_dst, true);

he cambiado a file_put_contents($file_dst, $animation->getImagesBlob()); y la mayoría de los ejemplos comenzó a trabajar inmediatamente.

espero que ayude a alguien.

+0

¡Increíble! ¡Esto me salvó el día! Gracias Anthony.Las versiones antiguas de Imagick son defectuosas cuando se utilizan writeImages, pero el uso de su método funciona bien y no presenta ningún problema. :) – FidoBoy

+0

esto hizo el truco cuando writeImages() quitaría la animación. – Jared

11

Probar GDEnhancer (Use ImageCraft). Solo necesita la Biblioteca GD, y mantiene la animación gif

+0

Gracias. ¿Se puede usar con PHP 5.2? En el sitio dice 5.4+, que es bastante innovador para la mayoría de los entornos (incluido mi entorno objetivo en este caso). De lo contrario, se ve genial! – Rolf

+0

Desgraciadamente, el sitio web de GDEnhancer está muerto. – TechNyquist

+0

@TechNyquist ahora GDEnhacer está en desuso, use https://github.com/coldume/imagecraft en su lugar – BredeBS

1

GIF Animation Resizer es una herramienta simple de una sola clase que hará el truco.

Nota: Utiliza una carpeta temporal para escribir los marcos separados. Si bien marca el tiempo de los marcos, es posible que deba crear una carpeta única si tiene la intención de usar esto en un servidor donde varios usuarios cambiarán el tamaño de GIF al mismo tiempo.

3

Si tiene ImageMagick instalado, puede utilizar una sola llamada a convert:

system("convert big.gif -coalesce -repage 0x0 -resize 200x100 -layers Optimize small.gif"); 
0

Imagecraft es una librería PHP GD fiable y extensión que mantiene animación GIF, editar y componer imágenes en múltiples capas y es compatible con marca de agua .

0

que utiliza esta función:

function gifResize($file_origin,$file_dest,$percent){  
    $crop_w = 0; 
    $crop_h = 0; 
    $crop_x = 0; 
    $crop_y = 0; 
    $image = new Imagick($file_origin); 
    $originalWidth = $image->getImageWidth(); 
    $originalHeight = $image->getImageHeight(); 
    $size_w = ($originalWidth*$percent)/100; 
    $size_h = ($originalHeight*$percent)/100; 
    if(($size_w-$originalWidth)>($size_h-$originalHeight)){ 
     $s = $size_h/$originalHeight; 
     $size_w = round($originalWidth*$s); 
     $size_h = round($originalHeight*$s); 
    }else{ 
     $s = $size_w/$originalWidth; 
     $size_w = round($originalWidth*$s); 
     $size_h = round($originalHeight*$s); 
    }  
    $image = $image->coalesceImages(); 

    foreach ($image as $frame) { 
     $frame->cropImage($crop_w, $crop_h, $crop_x, $crop_y); 
     $frame->thumbnailImage($size_h, $size_w); 
     $frame->setImagePage($size_h, $size_w, 0, 0); 
    } 
    $imageContent = $image->getImagesBlob(); 
    $fp = fopen($file_dest,'w'); 
    fwrite($fp,$imageContent); 
    fclose($fp); 

}

Cuestiones relacionadas