PHP – Создать простой анимированный GIF из двух изображений JPEG?

Кто-нибудь знает, возможно ли генерировать анимированный GIF из двух разных файлов JPEG, отображая одно изображение за х секунд, а затем и т. Д.?

Любые советы приветствуются.

Благодарю.

Невозможно использовать стандартные функции GD, которые предварительно заполняются PHP.

Для этого есть класс на phpclasses.org . Я никогда не использовал его сам, но он используется многими другими пакетами.

Кроме того, если у вас есть доступ к ImageMagick из PHP, используйте либо библиотеку MagickWand, либо командную строку. С ImageMagick это не проблема.

  • ImageMagick v6 Основы анимации (из руководства по IM)

  • Создание анимированного изображения GIF

Для приятного, быстрого и более нового решения см. Этот ответ SO .

Для еще более недавнего решения, вот моя развилка , с рядом небольших исправлений и улучшений. Пример этого из реального приложения:

$anim = new GifCreator\AnimGif(); $gif = $anim->create($image_files); //file_put_contents("test.gif", $gif); header("Content-type: image/gif"); echo $gif; 

(Требуется PHP5.3 с GD2.)

Пример, который работает с PHP 5.6 и GD 2.4.11:

 require_once "AnimGif.php"; /* * Create an array containing file paths, resource var (initialized with imagecreatefromXXX), * image URLs or even binary code from image files. * All sorted in order to appear. */ $image_files = array( //imagecreatefrompng("/../images/pic1.png"), // Resource var //"/../images/pic2.png", // Image file path //file_get_contents("/../images/pic3.jpg"), // Binary source code 'https://yt3.ggpht.com/-KxeE9Hu93eE/AAAAAAAAAAI/AAAAAAAAAAA/D-DB1Umuimk/s100-ck-no-mo-rj-c0xffffff/photo.jpg', // URL 'http://img.ruphp.com/php/AAEAAQAAAAAAAAloAAAAJDRkZGY2MWZmLTM1NDYtNDBhOS04MjYwLWNkM2UzYjdiZGZmMA.png', // URL 'http://img.ruphp.com/php/100x100bb.jpg' // URL ); /* * Create an array containing the duration (in millisecond) of each frame. */ $durations_millis = array( 1000, 2000, 3000 ); /* * Fix durations. */ $durations = array(); for ($i = 0; $i < count($durations_millis); $i++) { $durations[$i] = $durations_millis[$i] / 10; } /* * Specify number of loops. (0 = infinite looping.) */ $num_loops = 0; /* * Create gif object. */ $anim_gif = new GifCreator\AnimGif(); $gif_object = $anim_gif->create($image_files, $durations, $num_loops); /* * Get the animated GIF binary. */ $gif_binary = $gif_object->get(); /* * Set the file name of the saved/returned animated GIF. */ $file_name = "animated.gif"; /* * Optionally, save animated GIF in a folder as a GIF: */ //file_put_contents($file_name, $gif_binary); /* * Optionally, return the animated GIF to client. */ header("Content-type: image/gif"); header('Content-Disposition: filename="' . $file_name . '"'); // Optional echo $gif_binary; /* * All done. */ exit; 

Этого нельзя сделать с GD, но я нашел для него отличную библиотеку. Это немного сложно, поэтому, вот ссылка на библиотеку, которая делает анимированные gif с php. В нем объясняется, как использовать его полностью. http://www.phpclasses.org/package/3163-PHP-Generate-GIF-animations-from-a-set-of-GIF-images.html

Выберите 2 изображения и напишите 100 для скорости 900 для ширины и высоты. Он поместит их в анимированное слайд-шоу gif.

Вот код для этого скрипта:

 <?php if(isset($_POST['speed'])) { header('Content-type: image/gif'); if(isset($_POST['download'])){ header('Content-Disposition: attachment; filename="animated.gif"'); } include('GIFEncoder.class.php'); function frame($image){ ob_start(); imagegif($image); global $frames, $framed; $frames[]=ob_get_contents(); $framed[]=$_POST['speed']; ob_end_clean(); } foreach ($_FILES["images"]["error"] as $key => $error) { if ($error == UPLOAD_ERR_OK) { $tmp_name = $_FILES["images"]["tmp_name"][$key]; $im = imagecreatefromstring(file_get_contents($tmp_name)); $resized = imagecreatetruecolor($_POST['width'],$_POST['height']); imagecopyresized($resized, $im, 0, 0, 0, 0, $_POST['width'], $_POST['height'], imagesx($im), imagesy($im)); frame($resized); } } $gif = new GIFEncoder($frames,$framed,0,2,0,0,0,'bin'); echo $gif->GetAnimation(); } ?> <form action="" method="post" enctype="multipart/form-data"> <script src="http://code.jquery.com/jquery-latest.js"></script> <script src="jquery.MultiFile.js"></script> <script src="jquery.placeholder.js"></script> <input type="file" name="images[]" class="multi" /> <script> $(function(){ $('input[placeholder], textarea[placeholder]').placeholder(); }); </script> <SCRIPT language=Javascript> <!-- function isNumberKey(evt) { var charCode = (evt.which) ? evt.which : event.keyCode if (charCode > 31 && (charCode < 48 || charCode > 57)) return false; return true; } //--> </SCRIPT> <input name="speed" maxlength="10" type="text" placeholder="Speed of frames in ms" onkeypress="return isNumberKey(event)"> <input name="width" maxlength="4" type="text" placeholder="Width" onkeypress="return isNumberKey(event)"> <input name="height" maxlength="4" type="text" placeholder="Height" onkeypress="return isNumberKey(event)"> <input type="submit" name="download" value="Download!"> <input type="submit" name="preview" value="Preview!"> </form> в <?php if(isset($_POST['speed'])) { header('Content-type: image/gif'); if(isset($_POST['download'])){ header('Content-Disposition: attachment; filename="animated.gif"'); } include('GIFEncoder.class.php'); function frame($image){ ob_start(); imagegif($image); global $frames, $framed; $frames[]=ob_get_contents(); $framed[]=$_POST['speed']; ob_end_clean(); } foreach ($_FILES["images"]["error"] as $key => $error) { if ($error == UPLOAD_ERR_OK) { $tmp_name = $_FILES["images"]["tmp_name"][$key]; $im = imagecreatefromstring(file_get_contents($tmp_name)); $resized = imagecreatetruecolor($_POST['width'],$_POST['height']); imagecopyresized($resized, $im, 0, 0, 0, 0, $_POST['width'], $_POST['height'], imagesx($im), imagesy($im)); frame($resized); } } $gif = new GIFEncoder($frames,$framed,0,2,0,0,0,'bin'); echo $gif->GetAnimation(); } ?> <form action="" method="post" enctype="multipart/form-data"> <script src="http://code.jquery.com/jquery-latest.js"></script> <script src="jquery.MultiFile.js"></script> <script src="jquery.placeholder.js"></script> <input type="file" name="images[]" class="multi" /> <script> $(function(){ $('input[placeholder], textarea[placeholder]').placeholder(); }); </script> <SCRIPT language=Javascript> <!-- function isNumberKey(evt) { var charCode = (evt.which) ? evt.which : event.keyCode if (charCode > 31 && (charCode < 48 || charCode > 57)) return false; return true; } //--> </SCRIPT> <input name="speed" maxlength="10" type="text" placeholder="Speed of frames in ms" onkeypress="return isNumberKey(event)"> <input name="width" maxlength="4" type="text" placeholder="Width" onkeypress="return isNumberKey(event)"> <input name="height" maxlength="4" type="text" placeholder="Height" onkeypress="return isNumberKey(event)"> <input type="submit" name="download" value="Download!"> <input type="submit" name="preview" value="Preview!"> </form> 

Как вы видите, он ссылается на класс GIFEncoder, найденный по первой ссылке. Он также использует некоторую проверку javascript и multi-загрузку jQuery.

Примечание: этот вопрос уже задан.