Frage

Ich brauche eine animierte GIF-Datei, um die Größe, ohne die Animation zu zerstören.

Wie kann ich es mit PHP?

War es hilfreich?

Lösung

Wenn Sie ImageMagick-Zugang haben, können Sie dies tun:

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

Dies ist höchstwahrscheinlich möglich mit der ImageMagick-Plugin, wenn Sie System nicht () Zugriff

. Hinweis: Dies kann eine größere Dateigröße obwohl eine kleinere Dimensionen Bild erzeugt aufgrund koaleszierende das Bild im Wesentlichen deoptimizing

UPDATE: Wenn Sie nicht ImageMagick Zugang haben, sollten Sie eine Kombination der folgenden Schritte zu verwenden, um ein animiertes Gif, um die Größe (vorausgesetzt, Sie haben GD-Zugriff):

  1. erkennen, ob das Bild ein animiertes gif ist: Kann ich erkennen animierte Gifs php und gd mit? (oben Antwort)
  2. Teilen Sie die animierte GIF in einzelne Bilder: http://www.phpclasses.org/package/3234-PHP-Split-GIF-animations-into-multiple-images.html
  3. Ändern Sie die Größe der einzelnen Frames: http://www.akemapa.com/2008/07/10/php-gd-resize-transparent-image-png-gif/
  4. Recomposite die Rahmen in eine animierte gif wieder: http://www.phpclasses.org/package/3163-PHP-Generate-GIF-animations-from-a-set-of-GIF-images.html

Dies ist auf jeden Fall viel intensiver als die ImageMagick Strecke, aber es sollte technisch möglich sein.

Wenn Sie es erhalten, stellen Sie bitte mit der Welt teilen!

Andere Tipps

Versuchen GDEnhancer (Benutzen Sie Imagecraft). Es braucht nur GD-Bibliothek, und es GIF-Animation hält

Sie müßten die gif in Rahmen, Thumbnail und wieder zusammenbauen zersetzen.

Hier finden Sie aktuelle ImageMagick und dieses Tutorial .

Das Beispiel auf http://www.php.net/manual/en /imagick.coalesceimages.php Ihre gif Größe ändern, während die Frame-Timing zu halten. Etwas meisten anderen Beispiele nicht tun.

Weitere Beispiele Wiederaufbau die gif während diese Ihnen erlaubt, modify der Rahmen des Bildes.

Ich habe zahlreiche Beispiele für die Größenänderung animierte GIFs versucht, mit Imagick PHP-Modul, aber keiner von ihnen arbeitete für mich. Dann nach einiger Zeit des Debuggen schließlich fand ich die aktuelle Ausgabe: die Animation beim Speichern Bild auf der Festplatte verloren wurde, durch $animation->writeImage($file_dst); oder $animation->writeImages($file_dst, true);

Ich habe es geändert file_put_contents($file_dst, $animation->getImagesBlob()); und die meisten Beispiele begannen sofort mit der Arbeit.

Hoffe, es hilft jemand.

Wenn Sie ImageMagick installiert, dann können Sie einen einzigen Anruf verwenden, um convert:

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

Ich glaube, ich dies in der Tasche haben.

Diese Lösung ist keineswegs perfekt und enthält einige rohe Gewalt hier und da, aber ich konnte meinen GD / PHP-basierte Bildgrößenänderung Skript mit genügend Funktionalität anhängen Animationen zu unterstützen.

Die Lösung stark auf den ausgezeichneten Freeware-Bibliotheken von László Zsidi basiert - http: // www.phpclasses.org/browse/author/283569.html

Sie können eine kurze Demo überprüfen und laden Sie die Quellen von http://forssto.com/gifexample/ (direkter Link: http://forssto.com/gifexample/gifanimresize.zip )

BEKANNTE PROBLEME:

  • Transparenz-Unterstützung - dies wäre einfach zu dieser Lösung anhängen, aber wie ich ein unmittelbares Bedürfnis nicht für dies, ich bin hier zu stoppen.

  • Framerate - aus unbekannten Gründen die GifEncoder Klasse nicht nehmen Berücksichtigung der Frame-Raten angegeben. Ich muss schauen dies später.

  • Ich habe eine gif-Datei von meinem Set finden von Tests, die irgendwie anders hatten große Rahmen in ihm und dieser Animation konnte nicht richtig arbeiten. noch einige Debuggen zu tun dann.

nur creat 3 Ordnername 1.frame_output 2.images 3.resized_frame_output und downloaden 2-Encoder und Decoder-Klasse von diesem untenstehenden Link 1.Download Klasse "GIFDecoder.class.php" von http: //phpclasses.elib. com / browse / package / 3234.html 2.Download Klasse "GIFEncoder.class.php" von http: //phpclasses.betablue. net / browse / package / 3163.html

und dann den Namen des Skripts als "resize_animator.php" ausführen, creat eine html-Datei-Upload & Lassen Sie das Skript genießen.

.. speichern dieses Skript als ..... 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>

........................ speichern und dieses Skript als 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 ............

Kommentar- die usleep Funktion die Arbeit passiert in diese folders.its nicht notwendig, um zu sehen, aber ich benutze es um die Funktionalität zu sehen.

Wenn Sie ImageMagick in Ihrem Server nicht wollen, können Sie dies versuchen:

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

Die Klasse wird Ändern der Größe GIF-Animationen mit GD. Zuerst analysiert den Rahmen, dann paßt die Größe sie, nach, dass es sie kompiliert wieder in einzelne Datei, ohne seine Verzögerungszeiten, Entsorgungsmethoden, Farbtabellen usw.

Versuchen Sie, und wenn Sie einen Fehler oder wollen finden, um einige Optimierungen vorschlagen usw. Sie die Klasse Forum einbauen oder einen Kommentar auf der Seite in meiner Website verlassen. Und ich werde antworten, dass so schnell wie möglich.

Diese alle Antworten außer Trog ImageMagick funktioniert nicht für mich. Scripts in Antworten vor diesem sind alle voller Fehler.

Auch die Installation von ImageMagick schwierig war, so hier zu verwalten, ist meine Erfahrung.

Hier ist , wie ImageMagick auf Windows installieren 7 und Xampp 1.7.4.
Hinweis : Wählen Sie 64 Bit (für win7), und bei der Installation lassen Sie die Option geprüft "In dem Systempfad"

.

Und dann wie folgt vor: http://www.creativearmory.com/tutorials/resize -animated-gifs-mit-php-and-imagemagick

Ich habe verloren Stunden auf Skripte in diesen Beiträgen und ImageMagick und dieses Tutorial war sucessfull in wenigen Minuten.

Und noch eine Anmerkung:. Mein Webserver standardmäßig ImageMagick haben, so dass ich denke, die meisten von Servern es auch haben

GIF-Animation Resizer ist ein einfaches ein-Klassen-Tool, das den Trick tun wird.

Hinweis: Es verwendet einen temporären Ordner, die einzelne Frames zu schreiben. Während es die Rahmen-Zeitstempel, müssen Sie einen eindeutigen Ordner erstellen, wenn Sie beabsichtigen, diese auf einem Server zu verwenden, in denen mehrere Benutzer sein GIFs zugleich Ändern der Größe.

Imagecraft ist eine zuverlässige PHP GD-Bibliothek und Erweiterung, die GIF-Animation hält, zu bearbeiten und komponieren Bilder in mehrere Schichten und unterstützt Wasserzeichen.

Ich habe diese Funktion:

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

}

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top