2010-02-03 11 views

Antwort

6

Es ist nicht möglich, die Standard-GD-Funktionen zu verwenden, die bereits mit PHP geliefert werden.

Dafür gibt es eine class on phpclasses.org. Ich habe es nie selbst benutzt, aber es wird von vielen anderen Paketen benutzt.

Wenn Sie Zugriff auf ImageMagick von PHP haben, verwenden Sie entweder die MagickWand-Bibliothek oder die Befehlszeile. Mit ImageMagick ist das kein Problem.

+0

Der ** phpclasses.org ** -Code ist ein Albtraum für den Zugriff und die Eingabedateien dafür müssen GIF-Dateien sein. Es funktioniert nicht für JPEG-Dateien ...: -/ –

+0

Sie können Ihre Eingabe-JPEG-Bilder in (statische) GIF-Bilder konvertieren, indem Sie diese Antwort auf eine andere SO-Frage verwenden: https://stackoverflow.com/a/755843/1617737 –

3

Dies kann nicht mit GD getan werden, aber ich eine große Bibliothek für sie gefunden. Es ist ein bisschen kompliziert, aber hier ist ein Link zu der Bibliothek, die animierte Gifs mit PHP macht. Es erklärt, wie man es gründlich benutzt. http://www.phpclasses.org/package/3163-PHP-Generate-GIF-animations-from-a-set-of-GIF-images.html

Wählen Sie 2 Bilder und schreiben Sie 100 für die Geschwindigkeit 900 für Breite und Höhe. Es wird sie in eine animierte gif Diashow einfügen. Hier

ist der Code für das Skript:

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

Wie Sie sehen es die GIFEncoder Klasse verweist auf den ersten Link gefunden. Es verwendet auch einige Javascript-Validierung und jQuery-Multiupload.

Hinweis: Diese Frage wurde bereits gestellt.

+0

Danke für dein wirklich cooles Beispiel! – Roy

+0

@Tom, als ich diesen Code versuchte, Fehler wie "kann nicht angezeigt werden, weil es Fehler enthält." kannst du mir bitte helfen. – Jalpa

7

Für eine nette, schnelle und neuere Lösung, siehe this SO answer.

Für eine noch neuere Lösung, here is my fork davon, mit einer Reihe von kleinen Korrekturen & Verbesserungen. Ein Beispiel aus einer tatsächlichen Anwendung:

$anim = new GifCreator\AnimGif(); 

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

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

(Benötigt PHP5.3 mit GD2.)

Beispiel, die mit PHP 5.6 und GD arbeitet 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

Dies funktioniert nicht für meine (PHP5.6 mit GD2.4.11). Gibt mir einfach 'Das Bild '..."kann nicht angezeigt werden, weil es Fehler enthält." –

+1

@ ban-geoengineering, danke, dass du das herausgibst (Nun, alles ist möglich, da PHP5.6 damals nicht existierte.) Ein möglicher Fix wurde gerade mit dem Code zusammengeführt Bitte versuchen Sie es erneut, und wenn das Problem weiterhin besteht, senden Sie bitte ein Problem an das Projekt bei GitHub, damit es dort ordnungsgemäß adressiert werden kann. –

+0

Vielen Dank für das. Haben Sie Ihre Antwort gerade mit Arbeitscode-Snippet aktualisiert. –