因为动画 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);
?>