2010-02-03 12 views

Répondre

6

Il n'est pas possible d'utiliser les fonctions GD standard pré-emballées avec PHP. Il existe un class on phpclasses.org pour cela. Je ne l'ai jamais utilisé moi-même, mais il est utilisé par beaucoup d'autres paquets.

Alternativement, si vous avez accès à ImageMagick à partir de PHP, en utilisant la bibliothèque MagickWand ou la ligne de commande, utilisez-le. Avec ImageMagick, ce n'est pas un problème.

+0

Le code ** phpclasses.org ** est un cauchemar auquel accéder et les fichiers d'entrée pour ce fichier doivent être des fichiers GIF. Cela ne fonctionne pas pour les fichiers JPEG ...: -/ –

+0

Vous pouvez convertir vos images JPEG d'entrée en images GIF (statiques) en utilisant cette réponse à une autre question SO: https://stackoverflow.com/a/755843/1617737 –

3

Cela ne peut pas être fait avec GD, mais je l'ai trouvé une grande bibliothèque pour elle. C'est un peu compliqué, donc voici un lien vers la bibliothèque qui fait des gifs animés avec php. Il explique comment l'utiliser à fond. http://www.phpclasses.org/package/3163-PHP-Generate-GIF-animations-from-a-set-of-GIF-images.html

Sélectionnez 2 photos et écrivez 100 pour la vitesse 900 pour la largeur et la hauteur. Cela les mettra dans un diaporama animé.

Voici le code pour ce script:

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

Comme vous le voyez, il fait référence à la classe GIFEncoder trouvé sur le premier lien. Il utilise également une validation javascript et jQuery multi-upload.

Note: cette question a déjà été posée.

+0

Merci pour votre exemple vraiment cool! – Roy

+0

@Tom quand j'ai essayé ce code retour erreur comme "ne peut être affiché, car il contient des erreurs." Pouvez-vous m'aider s'il vous plaît. – Jalpa

7

Pour une solution agréable, rapide et plus récente, voir this SO answer. Pour une solution encore plus récente, here is my fork, avec un certain nombre de petites améliorations & améliorations. Un exemple de celui-ci à partir d'une application réelle:

$anim = new GifCreator\AnimGif(); 

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

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

(Nécessite PHP5.3 avec GD2.)

l'exemple qui fonctionne avec PHP 5.6 et GD 02/04/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

Cela ne fonctionne pas pour mon (PHP5.6 avec GD2.4.11). Juste me donne 'l'image '..."ne peut pas être affiché car il contient des erreurs." –

+1

@ ban-geoengineering, merci d'avoir signalé cela (bien, tout est possible, car PHP5.6 n'existait pas à l'époque.) Un correctif possible vient d'être fusionné au code S'il vous plaît réessayer, et si le problème persiste, s'il vous plaît soumettre un problème au projet à GitHub, afin qu'il puisse être adressé là correctement –

+0

Merci pour cela.Avons simplement mis à jour votre réponse avec extrait de code de travail. –