2010-02-03 12 views

Odpowiedz

6

Nie jest to możliwe przy użyciu standardowych funkcji GD, które są wstępnie pakowane w PHP. Jest to . Nigdy go nie używałem, ale jest używany przez wiele innych pakietów.

Alternatywnie, jeśli masz dostęp do ImageMagick z PHP, używając biblioteki MagickWand lub wiersza poleceń, użyj go. Dzięki ImageMagick nie stanowi to problemu.

+0

Kod ** phpclasses.org ** jest koszmarem dostępu, a pliki wejściowe do niego muszą być plikami GIF. Nie działa w przypadku plików JPEG ...: -/ –

+0

Można konwertować wejściowe obrazy JPEG na (statyczne) obrazy GIF, korzystając z tej odpowiedzi na inne pytanie SO: https://stackoverflow.com/a/755843/1617737 –

3

ta nie może być wykonana z GD ale znalazłem wielką bibliotekę dla niego. Jest to nieco skomplikowane, więc tutaj jest link do biblioteki, która tworzy animowane gify z php. Wyjaśnia, jak z niego korzystać. http://www.phpclasses.org/package/3163-PHP-Generate-GIF-animations-from-a-set-of-GIF-images.html

Wybierz 2 zdjęcia i wpisz 100 dla prędkości 900 dla szerokości i wysokości. Umieszcza je w animowanym pokazie gif.

Oto kod dla tego scenariusza:

<?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> 

Jak widać odwołuje klasę GIFEncoder znaleźć na pierwszy link. Używa również funkcji sprawdzania poprawności javascript i wielokrotnego ładowania jQuery.

Uwaga: to pytanie już zostało zadane.

+0

Dzięki za twój naprawdę fajny przykład! – Roy

+0

@Tom, gdy próbowałem tego kodu zwracać błąd, jak "nie można wyświetlić, ponieważ zawiera błędy." możesz mi pomóc. – Jalpa

7

Aby uzyskać ładne, szybkie i nowsze rozwiązanie, zobacz this SO answer.

Dla jeszcze nowszego rozwiązania, here is my fork tego, z kilkoma drobnymi poprawkami & ulepszeń. Przykład go od rzeczywistego zastosowania:

$anim = new GifCreator\AnimGif(); 

$gif = $anim->create($image_files); 
//file_put_contents("test.gif", $gif); 

header("Content-type: image/gif"); 
echo $gif; 

(Wymaga PHP5.3 z GD2.)

przykładzie działa 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-c-k-no-mo-rj-c0xffffff/photo.jpg', // URL 
    'https://media.licdn.com/mpr/mpr/shrinknp_100_100/AAEAAQAAAAAAAAloAAAAJDRkZGY2MWZmLTM1NDYtNDBhOS04MjYwLWNkM2UzYjdiZGZmMA.png', // URL 
    'http://is5.mzstatic.com/image/thumb/Purple128/v4/e4/63/e7/e463e779-e6d0-0c3d-3ec1-97fdbaae230a/source/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; 
+0

To nie działa dla mojego (PHP5.6 z GD2.4.11). Po prostu daje mi "Obraz" ..."nie można wyświetlić, ponieważ zawiera błędy." –

+1

@ ban-geoinżynieria, dzięki za wskazanie tego. (Cóż, wszystko jest możliwe, ponieważ PHP5.6 wtedy nie istniało.) Prawdopodobna poprawka właśnie została scalona z kodem tam, proszę spróbuj ponownie, a jeśli problem pozostanie, prześlij problem do projektu na GitHub, aby mógł być tam właściwie zaadresowany –

+0

Dziękuję za to. Właśnie zaktualizowałeś swoją odpowiedź za pomocą działającego fragmentu kodu. –

Powiązane problemy