我试图裁剪动画gif,在输出中我得到相同大小的图像,但是裁剪了。
很多空白空间都装满了画布。
例如我有动画gif 600x100,但已请求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);
答案 0 :(得分: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-&gt; cropImage($ width,$ height,$ x,$ y);你应该把你可能需要的值放在那里。
IE $ frame-&gt; 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
}
希望它有所帮助!
Ps:对不起我的英语:)
答案 1 :(得分:4)
ImageMagick通常有一个“页面”或工作区域,类似于背景图层。听起来像裁剪图像后仍然存在(我有一个令人困惑的时间在使用命令行工具进行一些合成和调整行为...)。
查看cropImage的PHP手册页,我看到了这个评论:
Christian Dehning - 2010年4月9日10:57
在裁剪gif图像时(我对jpg和png图像没有任何问题),画布不会被删除。请在裁剪的gif上运行以下命令,以删除空格:
$im->setImagePage(0, 0, 0, 0);