2010-02-03 43 views

回答

6

使用预先包装在PHP中的标准GD函数是不可能的。

这里有一个class on phpclasses.org。我从来没有使用它,但它被很多其他软件包使用。

或者,如果您有权访问来自PHP的ImageMagick,使用MagickWand库或命令行,请使用它。借助ImageMagick,这不成问题。

+0

** phpclasses.org **代码是访问的恶梦,输入文件必须是GIF文件。它不适用于JPEG文件...: -/ – 2017-12-06 20:45:00

+0

您可以使用此答案将输入的JPEG图像转换为(静态)GIF图像,并将其转换为另一个SO问题:https://stackoverflow.com/a/755843/1617737 – 2017-12-06 21:17:23

3

这不能与GD做,但我发现了一个伟大的图书馆吧。这虽然有点复杂,但是这里有一个连接到使用php制作动画GIF的库的链接。它解释了如何彻底使用它。 http://www.phpclasses.org/package/3163-PHP-Generate-GIF-animations-from-a-set-of-GIF-images.html

选择2张图片并写入宽度和高度为900的速度为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> 

正如你看到它引用的第一个链接上发现的GIFEncoder类。它也使用一些JavaScript验证和jQuery multiupload。

注意:这个问题已经被问到。

+0

感谢你真的很酷的例子! – Roy 2013-04-05 18:51:58

+0

@Tom当我尝试此代码返回错误,如“无法显示,因为它包含错误。”你能帮我么。 – Jalpa 2017-08-24 05:03:44

7

有关更好的,快速和更近期的解决方案,请参阅this SO answer

对于一个更近期的解决方案,here is my fork它,有一些小的修复&的改进。从实际应用中它的一个例子:

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

这不适用于我的(PHP5.6与GD2.4.11)。只是给了我'形象'...“无法显示,因为它包含错误。”# – 2017-12-06 20:17:59

+1

@ ban-geoengineering,感谢您指出了这一点(好吧,任何事情都可能,因为PHP5.6当时并不存在)。一个可能的修复程序刚刚合并到代码中在那里;请重试,如果问题仍然存在,请向GitHub的项目提交问题,以便它可以在那里正确解决问题 – 2017-12-07 18:52:04

+0

感谢您的支持,刚刚使用工作代码片段更新了您的答案。 – 2017-12-12 00:16:46