裁剪gif图像时(jpg和png图像没有问题),画布不会被移除。请在裁剪后的gif上运行以下命令以移除空白区域
$im->setImagePage(0, 0, 0, 0);
(PECL imagick 2, PECL imagick 3)
Imagick::cropImage — 提取图像区域
width
裁剪的宽度
height
裁剪的高度
x
裁剪区域左上角的X坐标
y
裁剪区域左上角的Y坐标
成功时返回 true
。
错误时抛出ImagickException。
示例 #1 Imagick::cropImage()
<?php
function cropImage($imagePath, $startX, $startY, $width, $height) {
$imagick = new \Imagick(realpath($imagePath));
$imagick->cropImage($width, $height, $startX, $startY);
header("Content-Type: image/jpg");
echo $imagick->getImageBlob();
}
?>
裁剪gif图像时(jpg和png图像没有问题),画布不会被移除。请在裁剪后的gif上运行以下命令以移除空白区域
$im->setImagePage(0, 0, 0, 0);
这是一个创建缩略图的简单函数。它接受一个附加参数来设置生成的缩略图的焦点。
<?php
function thumbnail($image, $new_w, $new_h, $focus = 'center')
{
$w = $image->getImageWidth();
$h = $image->getImageHeight();
if ($w > $h) {
$resize_w = $w * $new_h / $h;
$resize_h = $new_h;
}
else {
$resize_w = $new_w;
$resize_h = $h * $new_w / $w;
}
$image->resizeImage($resize_w, $resize_h, Imagick::FILTER_LANCZOS, 0.9);
switch ($focus) {
case 'northwest':
$image->cropImage($new_w, $new_h, 0, 0);
break;
case 'center':
$image->cropImage($new_w, $new_h, ($resize_w - $new_w) / 2, ($resize_h - $new_h) / 2);
break;
case 'northeast':
$image->cropImage($new_w, $new_h, $resize_w - $new_w, 0);
break;
case 'southwest':
$image->cropImage($new_w, $new_h, 0, $resize_h - $new_h);
break;
case 'southeast':
$image->cropImage($new_w, $new_h, $resize_w - $new_w, $resize_h - $new_h);
break;
}
}
?>
实际上,如果您计划对裁剪后的图像进行更多涉及定位和/或重力的更改,Imagick::setImagePage(0,0,0,0) 对jpg和png也很有用(我创建了一个脚本,一次性完成裁剪、面部模糊和水印,并且很难确定为什么模糊和水印文本从未出现过……)。
我有一个函数,它接收一个图像,调整大小并裁剪它,并将其保存为普通图像,然后再次调整大小并裁剪它以创建缩略图。第二次裁剪的数字完全错误,计算是完美的,问题是第二次裁剪没有重置imagePage,因此如果您尝试两次裁剪相同的图像,最好先重置它。
<?php
$thumb = new Imagick($file)
$thumb->resizeImage($r_w1,$r_h1,Imagick::FILTER_CATROM,0.9, false);
$thumb->cropImage($w1,$h1,$l1,$t1);
$thumb->writeImage($destinationPath.'/'.$fileName);
$thumb->resizeImage($r_w2,$r_h2,Imagick::FILTER_CATROM,0.9, false);
$thumb->setImagePage(0, 0, 0, 0);
$thumb->cropImage($w2,$h2,$l2,$t2);
$thumb->writeImage($destinationPath.'/'.$fileNameThumb);
?>
顺便说一句,我需要精确的尺寸,所以我不得不将“bestfit”设置为false。