Pregunta

Necesito cambiar el tamaño de un archivo GIF animado sin destruir la animación.

¿Cómo puedo hacerlo usando PHP?

¿Fue útil?

Solución

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 tiene el sistema () de 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. detectar si la imagen es un gif animado: ¿Puedo detectar gifs animados usando PHP y 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 las tramas 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 intensa que la ruta ImageMagick, pero debería ser técnicamente posible.

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

Otros consejos

Trate GDEnhancer (Uso Imagecraft ). Sólo se necesita la biblioteca GD, y mantener la animación GIF

Usted tendría que descomponer el gif en cuadros, miniaturas y volver a montar.

Tener un vistazo a ImageMagick y este tutorial .

El ejemplo de http://www.php.net/manual/en /imagick.coalesceimages.php cambiará el tamaño de su gif, conservando su tiempo de imágenes. Algo que la mayoría de los otros ejemplos que no hacemos.

Otros ejemplos Reconstruir el gif mientras éste le permite a Modificar los marcos de la imagen.

He intentado numerosos ejemplos de cambiar el tamaño de GIF animados con el módulo Imagick PHP, pero ninguno de ellos trabajó para mí. A continuación, después de algún tiempo de depuración, por fin he encontrado 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 comenzaron a trabajar inmediatamente.

Espero que ayuda a alguien.

Si ha instalado ImageMagick entonces se puede utilizar una sola llamada a convert:

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

Creo que lo he entendido en la bolsa.

Esta solución es de ninguna manera perfecta y contiene un poco de fuerza bruta, aquí y allá, pero yo era capaz de añadir mi GD / script PHP cambiar el tamaño de la imagen basada en la funcionalidad suficiente para mantener a las animaciones.

La solución se basa en gran medida de 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 como no tengo una necesidad inmediata de esto, estoy parando aquí.

  • Tasa de imágenes - por alguna razón desconocida la clase GifEncoder no toma en cuenta las velocidades de cuadro especificado. Voy a tener que buscar en esto más adelante.

  • 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 dejado de funcionar correctamente. aún así, algunos depuración a hacer a continuación.

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 1.Download clase "GIFDecoder.class.php" de http: //phpclasses.elib. com / browse / paquete / 3234.html 2.Download clase "GIFEncoder.class.php" de http: //phpclasses.betablue. net / Navegar / paquete / 3163.html

y ejecute el nombre del script como "resize_animator.php", creat una carga de archivos html y deje Disfrute del guión.

.. guardar 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 ............

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

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. En primer lugar analiza los marcos, a continuación, les cambia el tamaño, después de que los compila de nuevo en un solo archivo sin perder su tiempos de retardo, los métodos de eliminación, tablas de color, etc.

Trate y si encuentras un error o desea sugerir algunas optimizaciones etc Usted puede utilizar el foro de clase o dejar un comentario en la página en mi sitio web. Y voy a responder que lo antes posible.

Todas estas respuestas, excepto que ImageMagick no funcionó para mí.Los guiones de las respuestas anteriores a esto están llenos de errores.

Incluso instalar ImageMagick fue difícil de administrar, así que aquí está mi experiencia.

Aquí está cómo instalar ImageMagick en Windows 7 y xampp 1.7.4.
Nota:Elija 64 bits (para win7) y, al instalar, deje marcada la opción "Agregar a la ruta del sistema".

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

He perdido horas en scripts en estas publicaciones, e ImageMagick y este tutorial fueron exitosos en minutos.

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

GIF animados Resizer es una herramienta sencilla de una sola clase que va a hacer el truco.

Nota: Utiliza una carpeta temporal para escribir los marcos separados. A pesar de que las marcas de tiempo de los marcos, es posible que tenga que crear una carpeta única si tiene la intención de utilizar esto en un servidor en el que múltiples usuarios podrán cambiar el tamaño de los archivos GIF al mismo tiempo.

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

He utilizado 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);

}

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top