1

我正在向 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>";
                }
            }
4

1 回答 1

3

由于动画 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); 
?>
于 2013-10-19T18:14:20.647 回答