Domanda

Devo ridimensionare un file GIF animato senza distruggere l'animazione.

Come posso farlo usando PHP?

È stato utile?

Soluzione

se si ha accesso ImageMagick, si può fare questo:

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

questo è possibile molto probabilmente con il plugin ImageMagick, se non si dispone di sistema () l'accesso

NOTA:. Puo creare uno spazio più grande un'immagine dimensioni più piccole tuttavia, a causa essenzialmente coalescenza deoptimizing dell'immagine

UPDATE: Se non si ha accesso ImageMagick, si dovrebbe essere in grado di utilizzare una combinazione dei seguenti passaggi per ridimensionare una gif animata (ammesso che abbiate accesso GD):

  1. Detect Se l'immagine è una GIF animata: Posso rilevare gif animate utilizzando PHP e GD? (risposta in alto)
  2. Dividere la gif animata in singoli fotogrammi: http://www.phpclasses.org/package/3234-PHP-Split-GIF-animations-into-multiple-images.html
  3. Ridimensiona i singoli frame: http://www.akemapa.com/2008/07/10/php-gd-resize-transparent-image-png-gif/
  4. Recomposite i fotogrammi in una GIF animata di nuovo: http://www.phpclasses.org/package/3163-PHP-Generate-GIF-animations-from-a-set-of-GIF-images.html

Questo è sicuramente molto più intenso rispetto al percorso di ImageMagick, ma dovrebbe essere tecnicamente possibile.

Se ti capita di lavoro, si prega di condividere con il mondo!

Altri suggerimenti

Prova GDEnhancer (Usa ImageCraft ). E 'solo bisogno GD Biblioteca, e mantenere l'animazione GIF

Si avrebbe bisogno di scomporre il GIF in fotogrammi, miniature e rimontare.

Dai un'occhiata alla ImageMagick e questo tutorial .

L'esempio a http://www.php.net/manual/en /imagick.coalesceimages.php ridimensionerà la tua gif, pur mantenendo la vostra sincronizzazione cornice. Qualcosa la maggior parte degli altri esempi non fanno.

Altri esempi ricostruzione la gif mentre questo permette di Modifica i fotogrammi dell'immagine.

Ho provato numerosi esempi di ridimensionamento GIF animate con modulo Imagick PHP, ma nessuno di loro ha lavorato per me. Poi, dopo un certo tempo di debug, finalmente ho trovato il problema effettivo: l'animazione è stato perso su di salvataggio immagine su disco, per $animation->writeImage($file_dst); o $animation->writeImages($file_dst, true);

Ho cambiato in file_put_contents($file_dst, $animation->getImagesBlob()); e la maggior parte esempi iniziato a lavorare immediatamente.

Speranza che aiuta qualcuno.

Se avete installato ImageMagick quindi è possibile utilizzare una singola chiamata a convert:

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

Credo di aver ottenuto questo nella borsa.

Questa soluzione non è affatto perfetta e contiene una forza bruta qua e là, ma sono stato in grado di aggiungere basata su script di ridimensionamento immagine mio GD / PHP con abbastanza funzionalità per supportare le animazioni.

La soluzione è fortemente basato sulle librerie eccellenti del freeware di László Zsidi - http: // www.phpclasses.org/browse/author/283569.html

È possibile controllare un demo veloce e scaricare i sorgenti da http://forssto.com/gifexample/ (link diretto: http://forssto.com/gifexample/gifanimresize.zip )

PROBLEMI NOTI:

  • supporta la trasparenza - questo sarebbe facile da aggiungere a questa soluzione, ma come io non ho un bisogno immediato di questo, mi fermo qui.

  • Frame rate - per qualche motivo sconosciuto la classe GifEncoder non riesce a prendere in considerazione il frame rate specificato. Ho bisogno di guardare in questo più tardi.

  • Ho trovato un unico file GIF dal mio set di test che in qualche modo hanno avuto diversi telai di dimensioni in essa e che l'animazione non è riuscito a funzionare correttamente. ancora un po ' debug per fare poi.

solo creat 3 cartella 2.images nome 1.frame_output 3.resized_frame_output e scaricare 2 encoder e decoder classe da questo collegamento qui sotto Classe 1.Download "GIFDecoder.class.php" da http: //phpclasses.elib. com / browse / pacchetto / 3234.html Classe 2.Download "GIFEncoder.class.php" da http: //phpclasses.betablue. net / browse / pacchetto / 3163.html

e quindi eseguire il nome dello script come "resize_animator.php", creat un file di caricamento html & Let Godetevi lo script.

.. salvare questo script come ..... 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>

........................ salvare e questo script come 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>";
  }
  ?>

....................... consente di godere di ............

rimuovere il commento dalla funzione di usleep di vedere il lavoro avvenga in quelle folders.its non è necessario, ma lo uso per vedere la funzionalità.

Se non avete Imagemagick nel server si consiglia di provare questo:

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

La classe è il ridimensionamento animazioni GIF con GD. In primo luogo analizza i fotogrammi, poi li ridimensiona, dopo che li compila di nuovo in un solo file senza perdere la sua tempi di ritardo, metodi di smaltimento, le tabelle dei colori ecc

Prova e se si trova un bug o volete suggerire alcune ottimizzazioni, ecc è possibile utilizzare il forum di classe o lasciare un commento sulla pagina nel mio sito. E io rispondo che al più presto.

Tutte queste risposte tranne che ImageMagick non ha funzionato per me.Gli script nelle risposte precedenti sono tutti pieni di errori.

Anche l'installazione di ImageMagick è stata difficile da gestire, quindi ecco la mia esperienza.

Qui è come installare ImageMagick su Windows 7 e xampp 1.7.4.
Nota:Scegli 64 bit (per Win7) e durante l'installazione lascia selezionata l'opzione "Aggiungi al percorso di sistema".

E poi segui:http://www.creativearmory.com/tutorials/resize-animated-gifs-with-php-and-imagemagick

Ho perso ore sugli script in questi post e ImageMagick e questo tutorial hanno avuto successo in pochi minuti.

E ancora una nota:il mio server web ha ImageMagick per impostazione predefinita, quindi immagino che anche la maggior parte dei server lo abbia.

GIF Animazione Resizer è un semplice strumento di una classe che farà il trucco.

Nota: Si utilizza una cartella temporanea di scrivere i fotogrammi separati. Mentre timestamp le cornici, potrebbe essere necessario creare una cartella unica, se si intende utilizzare questo su un server in cui più utenti saranno ridimensionamento GIF allo stesso tempo.

Imagecraft è un affidabile libreria PHP GD e l'estensione che mantiene animazione GIF, modificare e comporre le immagini in strati multipli e supporta filigrana.

Ho usato questa funzione:

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

}

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top