我正在想象一个图像,当它是一个GIF动画时,它会移除动画并留下一个静止图像。这是因为调整大小代码?或者它是想象库中固有的东西?下面是我的代码,这里有什么问题?
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>";
}
}
答案 0 :(得分:2)
因为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);
?>