问题 PHP - 从两个JPEG图像创建简单的动画GIF?


有谁知道是否可以从两个不同的JPEG文件生成动画GIF,显示一个图像x秒然后另一个,依此类推......?

任何建议表示赞赏

谢谢。


5725
2018-02-03 11:02


起源



答案:


使用预装PHP的标准GD功能是不可能的。

有一个 phpclasses.org上的课程 为了这。我自己从来没有使用它,但它被许多其他软件包使用。

或者,如果您有权访问 ImageMagick的 从PHP,使用任何一个 MagickWand 库或命令行,使用它。使用ImageMagick,没问题。


6
2018-02-03 11:05



该 phpclasses.org 代码是一个访问的噩梦,它的输入文件必须是GIF文件。它不适用于JPEG文件......: - / - ban-geoengineering
您可以使用对另一个SO问题的答案将输入的JPEG图像转换为(静态)GIF图像: stackoverflow.com/a/755843/1617737 - ban-geoengineering


答案:


使用预装PHP的标准GD功能是不可能的。

有一个 phpclasses.org上的课程 为了这。我自己从来没有使用它,但它被许多其他软件包使用。

或者,如果您有权访问 ImageMagick的 从PHP,使用任何一个 MagickWand 库或命令行,使用它。使用ImageMagick,没问题。


6
2018-02-03 11:05



该 phpclasses.org 代码是一个访问的噩梦,它的输入文件必须是GIF文件。它不适用于JPEG文件......: - / - ban-geoengineering
您可以使用对另一个SO问题的答案将输入的JPEG图像转换为(静态)GIF图像: stackoverflow.com/a/755843/1617737 - ban-geoengineering


有关一个不错的,快速的和最新的解决方案,请参阅 这个答案

对于更新的解决方案, 这是我的叉子 它,有一些小的修复和改进。来自实际应用的一个例子:

$anim = new GifCreator\AnimGif();

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

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

(GD2需要PHP5.3。)

适用于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;

7
2018-04-24 23:46



这不适合我(PHP5.6 with GD2.4.11)。只是给我 The image "..." cannot be displayed because it contains errors. - ban-geoengineering
@ ban-geoengineering,感谢你指出这一点。 (好吧,一切皆有可能,因为当时PHP5.6并不存在。)一个可能的修复程序刚刚合并到那里的代码中;请重试,如果问题仍然存在,请向GitHub的项目提交一个问题,以便可以在那里正确处理。 - Sz.
感谢那。刚刚使用工作代码段更新了您的答案。 - ban-geoengineering


这不能用GD完成,但我找到了一个很棒的库。虽然它有点复杂,所以这里有一个链接到库,用PHP制作动画GIF。它解释了如何彻底使用它。 http://www.phpclasses.org/package/3163-PHP-Generate-GIF-animations-from-a-set-of-GIF-images.html

选择2张图片,并为宽度和高度写入速度900的100。它将把它们放在动画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。

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


3
2017-11-09 05:08



谢谢你真的很酷的例子! - Roy
@Tom,当我尝试此代码返回错误,如“无法显示,因为它包含错误。”你能帮我么。 - Jalpa