Imagick 制作动画 GIF 不动画?

Posted

技术标签:

【中文标题】Imagick 制作动画 GIF 不动画?【英文标题】:Imagick making animated gifs not animated? 【发布时间】:2021-07-19 06:27:16 【问题描述】:

我正在向 imagick 发送一个图像,当它是一个动画 gif 时,它会删除动画并留下一个静止的图像。这是因为调整大小代码吗?或者它是 imagick 库中固有的东西?下面是我的代码,这里有什么问题?

            if (isset($_FILES["image"])) 
                $allowed_ext = array("jpg", "jpeg", "png", "gif");
                $file_name = $_FILES["image"]["name"];
                $file_ext = strtolower(end(explode(".", $file_name)));
                $file_size = $_FILES["image"]["size"];
                $file_tmp = $_FILES["image"]["tmp_name"];

                // verify extension
                if (in_array($file_ext, $allowed_ext) && $file_size < 2097152) 
                    // check if image needs scaling
                    $img = new imagick($file_tmp);
                    $img_size = $img->getImageGeometry();

                    $partyCommentErrors .= "<li>Width: ".$img_size["width"]." | Height: ".$img_size["height"]."</li>";

                    if ($img_size["width"] > 600 || $img_size["height"] > 600) 
                        // resize image
                        $img->resizeImage(600, 600, imagick::FILTER_LANCZOS, 0.9, true);
                    

                    $img_size = $img->getImageGeometry();
                    $img->writeImage("imgs/commentpics/".$id.".".$file_ext);

                    // update database
                    $qry = "UPDATE comments SET thereisimg=1, imgtype='".$file_ext."', imgwidth='".$img_size["width"]."', imgheight='".$img_size["height"]."' WHERE id=$id";
                    mysqli_query($dblink, $qry);

                 else 
                    $partyCommentErrors .= "<li>File type must be jpg, jpeg, png, or gif</li><li>File size must be less than 2 megabytes.</li>";
                
            

【问题讨论】:

只是一个小问题:为什么你认为代码必须首先创建一个动画 gif? 它不是在创建图像。它从表单中获取图像并获取其尺寸,然后在必要时调整其大小并保存。抱歉,可能应该说清楚。 好吧,再说一次,为什么认为它必须保存为动画 gif 呢? 那么为什么不呢?如果输入图像是动画 gif,那么输出图像肯定应该是相同的文件,只是调整了大小,对吗?还是我错了? 【参考方案1】:

由于动画 gif 不存储为完整图像,而是存储为动画帧之间的差异,因此您需要调用 Imagick::coalesceImages 才能修改 Gif 中包含的图像。

修改它们后,您需要调用Imagick::deconstructImages 来生成帧之间的新差异集,以便能够将它们保存为动画 Gif。

<?php
$imagick = new Imagick("original.gif");

$format = $imagick->getImageFormat();
if ($format == 'GIF') 
  $imagick = $imagick->coalesceImages();
  do 
     $imagick->resizeImage(120, 120, Imagick::FILTER_BOX, 1);
   while ($imagick->nextImage());
  $imagick = $imagick->deconstructImages();
  $imagick->writeImages('new_120x120.gif', true);

  // can be added some more gifs
  $imagick = $imagick->coalesceImages();
  do 
     $imagick->resizeImage(100, 100, Imagick::FILTER_BOX, 1);
   while ($imagick->nextImage());
  $imagick = $imagick->deconstructImages();
  $imagick->writeImages('new_100x100.gif', true);


$imagick->clear();
$imagick->destroy();

或者,更简单地说:

<?php 
$image = new Imagick($file_src); 

$image = $image->coalesceImages(); 

foreach ($image as $frame)  
  $frame->cropImage($crop_w, $crop_h, $crop_x, $crop_y); 
  $frame->thumbnailImage($size_w, $size_h); 
  $frame->setImagePage($size_w, $size_h, 0, 0); 
 

$image = $image->deconstructImages(); 
$image->writeImages($file_dst, true); 
?>

【讨论】:

我有一些动画 gif,它们具有相同的暂停帧,当我调整大小和解构图像时,我丢失了所有相同的,并且 gif 播放得更快,没有明显的暂停……从 62 帧我得到 25 @CristianRusu 将您的问题作为一个新问题提出,或者如果您确实认为这是一个错误,请打开错误报告:github.com/Imagick/imagick

以上是关于Imagick 制作动画 GIF 不动画?的主要内容,如果未能解决你的问题,请参考以下文章

PHP使用JPG生成GIF动画图片,基于php_imagick_st-Q8.dll

go制作gif动画

如何使用 ImageMagick (php) 调整动画 gif 的大小?

隐藏后如何在 IE 中制作 gif 动画?

PHP Imagick 中的裁剪错误?

没有 Imagick 的图像调整大小并失去透明度