Question

J'ai besoin de redimensionner un fichier GIF animé sans détruire l'animation.

Comment puis-je le faire en utilisant PHP?

Était-ce utile?

La solution

si vous avez accès à ImageMagick, vous pouvez faire ceci:

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

est très probablement possible avec le plugin ImageMagick si vous n'avez pas accès au système ()

NOTE:. Cela peut créer une plus grande taille du fichier si une plus petite dimension image due à coalescent essentiellement deoptimizing l'image

Mise à jour: Si vous n'avez pas accès ImageMagick, vous devriez être en mesure d'utiliser une combinaison des étapes suivantes pour redimensionner une image GIF animée (en supposant que vous avez accès GD):

  1. Détecte si l'image est une image GIF animée: Puis-je détecter gifs animés en utilisant PHP et GD? (top réponse)
  2. Diviser le gif animé en images individuelles: http://www.phpclasses.org/package/3234-PHP-Split-GIF-animations-into-multiple-images.html
  3. Redimensionner les images individuelles: http://www.akemapa.com/2008/07/10/php-gd-resize-transparent-image-png-gif/
  4. Recomposite les images dans un fichier GIF animé à nouveau: http://www.phpclasses.org/package/3163-PHP-Generate-GIF-animations-from-a-set-of-GIF-images.html

Ceci est certainement beaucoup plus intense que la route ImageMagick, mais il devrait être techniquement possible.

Si vous le faire fonctionner, s'il vous plaît partager avec le monde!

Autres conseils

Essayez GDEnhancer ( ImageCraft ). Il ne faut bibliothèque GD, et garder l'animation gif

Vous devrez décomposer le GIF en images, miniatures et réassembler.

Jetez un oeil à ImageMagick et ce tutoriel.

L'exemple http://www.php.net/manual/en /imagick.coalesceimages.php redimensionnera votre gif tout en conservant votre timing de cadre. Quelque chose la plupart des autres exemples ne le font pas.

D'autres exemples Régénérer gif tandis que celui-ci vous permet de modify les cadres de l'image.

J'ai essayé de nombreux exemples de redimensionnement des GIF animés avec le module Imagick PHP, mais aucun d'entre eux travaillaient pour moi. Puis, après un certain temps de débogage enfin j'ai trouvé la véritable question: l'animation a été perdue lors de l'enregistrement image sur le disque, par $animation->writeImage($file_dst); ou $animation->writeImages($file_dst, true);

Je l'ai changé pour file_put_contents($file_dst, $animation->getImagesBlob()); et la plupart des exemples ont commencé à travailler immédiatement.

Je espère que ça aide quelqu'un.

Si vous avez ImageMagick installé, vous pouvez utiliser un seul appel à convert:

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

Je pense que j'ai ce dans le sac.

Cette solution est loin d'être parfait et contient une force brute ici et là, mais j'ai pu ajouter mon script de redimensionnement d'image à base GD / PHP avec suffisamment de fonctionnalités pour soutenir les animations.

La solution est fortement basée sur les excellentes bibliothèques freeware par László Zsidi - http: // www.phpclasses.org/browse/author/283569.html

Vous pouvez consulter une démonstration rapide et télécharger les sources de http://forssto.com/gifexample/ (lien direct: http://forssto.com/gifexample/gifanimresize.zip )

PROBLÈMES CONNUS:

  • Prise en charge de la transparence - ce serait facile à ajouter à cette solution, mais comme je n'ai pas un besoin immédiat cela, je suis ici arrêter.

  • Frame rate - pour une raison inconnue la classe GifEncoder ne prend pas tenant compte des taux de trame spécifié. Je vais devoir examiner plus tard.

  • J'ai trouvé un fichier gif de mon jeu des tests qui avaient quelque peu différents cadres de taille en elle et que l'animation pas fonctionner correctement. encore quelques le débogage à faire alors.

juste creat nom 3 dossier 1.frame_output 2.images 3.resized_frame_output et télécharger 2 codeur et décodeur de classe à partir de ce lien ci-dessous classe 1.Download "GIFDecoder.class.php" de http: //phpclasses.elib. com / browse / paquet / 3234.html classe 2.Download "GIFEncoder.class.php" de http: //phpclasses.betablue. net / browse / paquet / 3163.html

et puis exécutez le nom du script comme "resize_animator.php", creat un fichier html de téléchargement et le script permettent de profiter.

.. enregistrer ce script ..... 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>

........................ enregistrer et ce script 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>";
  }
  ?>

....................... PROFITEZ ............ LETS

décommenter la fonction usleep pour voir le travail se produit dans ces folders.its pas nécessaire, mais je peux l'utiliser pour voir la fonctionnalité.

Si vous n'avez pas ImageMagick dans votre serveur, vous pouvez essayer ceci:

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

La classe est redimensionne des animations GIF avec GD. Tout d'abord les cadres parse, puis les redimensionne, après qu'il les compile à nouveau en un seul fichier sans perdre son temps de retard, les méthodes d'élimination, tables de couleurs etc.

Essayez et si vous trouvez un bug ou si vous voulez suggérer des optimisations etc., vous pouvez utiliser le forum de classe ou laisser un commentaire sur la page de mon site. Et je vais vous répondre le plus tôt possible.

toutes les réponses sauf creux ImageMagick travail na pas pour moi. Les scripts dans des réponses avant ce sont tous pleins d'erreurs.

Même l'installation d'ImageMagick était difficile à gérer est mon expérience de même ici.

Voici comment installer ImageMagick sur les fenêtres 7 et xampp 1.7.4.
Note : Choisissez 64 bits (pour win7), et lors de l'installation de congé coché l'option "Ajouter au chemin du système"

.

Et puis suivre: http://www.creativearmory.com/tutorials/resize -animated-gifs-avec-php-et-ImageMagick

J'ai perdu des heures sur des scripts à ce poste, et ImageMagick et ce tutoriel était sucessfull en quelques minutes.

Encore une remarque:. Mon serveur web ImageMagick par défaut, donc je suppose que la plupart des serveurs ont aussi

Animation GIF Resizer est un outil simple d'une classe qui fera l'affaire.

Remarque: Il utilise un dossier temporaire pour écrire les cadres séparés. Bien qu'il les cadres horodatages, vous devrez peut-être créer un dossier unique si vous avez l'intention de l'utiliser sur un serveur où plusieurs utilisateurs seront redimensionner GIFs en même temps.

Imagecraft est une bibliothèque GD PHP fiable et d'extension qui maintient l'animation GIF, éditer et composer des images en de multiples couches et supports filigrane.

J'ai utilisé cette fonction:

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

}

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top