PHP Imagick中的裁剪错误?

3
我试图裁剪动画gif,输出结果是同样大小的图像,但已被裁剪。
很多空白区域都填充了画布。
例如,我有一个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);
2个回答

6
我遇到了和你一样的问题,我发现解决方法是使用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);时,您应该放置您可能需要的值。

例如:$frame->cropImage($s['params']['w'], $s['params']['h'], $s['params']['x'], $s['params']['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
}

希望这能有所帮助! 附注:抱歉我的英语不好 :)

是的,我也是这样做的。 :) 忘了在这里回帖。不管怎样,还是谢谢你)coalesce 是关键。 - Somebody
仅凭肉眼观察,这将失败,因为$x或$y中只有一个被定义。 - Andrew U

5
通常ImageMagick有一个“页面”或工作区,类似于背景层。听起来在裁剪图像后这仍然存在(之前我在使用命令行工具时遇到了一些混乱的合成和调整大小的行为...)。
查看cropImage的PHP手册页面,我看到了这个评论:

Christian Dehning - 09-Apr-2010 10:57
当裁剪gif图像(我没有遇到jpg和png图像的问题)时,画布不会被移除。请对裁剪后的gif运行以下命令以删除空白空间:

$im->setImagePage(0, 0, 0, 0);

1
你是在每个帧上尝试还是整张图片上尝试? - JAL
我的 Imagick 在仅裁剪高度时会减小高度。这个技巧起了作用。在裁剪命令之前添加这行代码。 - wp student

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接