我试图裁剪动画 gif,在输出中我得到了相同大小的图像,但被裁剪了。

很多空白空间都装满了 Canvas 。

例如,我有 600x100 的动画 gif,但要求裁剪 100x100,在输出时我得到 600x100 的图像,其中包含裁剪图像和空白区域。

有人知道这个问题的解决方案吗?

$gif = new Imagick($s['src']);

foreach($gif as $frame){
  $frame->cropImage($s['params']['w'], $s['params']['h'], $s['params']['x'], $s['params']['y']);
}

$gif->writeImages($s['dest_path'] .'/'. $fullname,true);

最佳答案

我和你遇到了同样的问题,我发现解决方案是使用 coalesceimages 函数。

这是一个使用 Imagick 在 php 中裁剪和调整动画 gif 大小的工作示例:

<?php
// $width and $height are the "big image"'s proportions
if($width > $height) {
    $x     = ceil(($width - $height) / 2 );
    $width = $height;
} elseif($height > $width) {
    $y      = ceil(($height - $width) / 2);
    $height = $width;
}

$image = new Imagick(HERE_YOU_PUT_BIG_IMAGE_PATH);
$image = $image->coalesceImages(); // the trick!
foreach ($image as $frame) {
    $frame->cropImage($width, $height, $x, $y); // You crop the big image first
    $frame->setImagePage(0, 0, 0, 0); // Remove canvas
}
$image = $image->coalesceImages(); // We do coalesceimages again because now we need to resize
foreach ($image as $frame) {
    $frame->resizeImage($newWidth, $newHeight,Imagick::FILTER_LANCZOS,1); // $newWidth and $newHeight are the proportions for the new image
}
$image->writeImages(CROPPED_AND_RESIZED_IMAGE_PATH_HERE, true);
?>

上面的代码用于生成具有相同高度和高度的缩略图。
你可以按照你想要的方式改变它。

请注意,当使用 $frame->cropImage($width, $height, $x, $y);你应该把你可能需要的值放在那里。

IE $frame->cropImage($s['params']['w'], $s['params']['h'], $s['params']['x'], $s['参数']['y']);

当然,如果您只想裁剪而不是裁剪和调整大小,可以这样做:
$image = new Imagick(HERE_YOU_PUT_BIG_IMAGE_PATH);
$image = $image->coalesceImages(); // the trick!
foreach ($image as $frame) {
    $frame->cropImage($s['params']['w'], $s['params']['h'], $s['params']['x'], $s['params']['y']);
    $frame->setImagePage(0, 0, 0, 0); // Remove canvas
}

希望能帮助到你!

Ps:对不起我的英语:)

关于php - PHP Imagick 中的裁剪错误?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3950712/

10-13 05:34