在裁剪 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);
?>
顺便说一句,我需要完美的尺寸,所以我不得不将“最佳拟合”设置为 false。