PHP Conference Japan 2024

Imagick::cropImage

(PECL imagick 2, PECL imagick 3)

Imagick::cropImage提取图像区域

描述

public Imagick::cropImage(
    int $width,
    int $height,
    int $x,
    int $y
): bool

提取图像区域。

参数

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();
}

?>

添加备注

用户贡献的备注 4 条备注

17
Christian Dehning
14 年前
裁剪gif图像时(jpg和png图像没有问题),画布不会被移除。请在裁剪后的gif上运行以下命令以移除空白区域

$im->setImagePage(0, 0, 0, 0);
5
olav at schettler dot net
8 年前
这是一个创建缩略图的简单函数。它接受一个附加参数来设置生成的缩略图的焦点。

<?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;
}
}
?>
5
ElPadre
14 年前
实际上,如果您计划对裁剪后的图像进行更多涉及定位和/或重力的更改,Imagick::setImagePage(0,0,0,0) 对jpg和png也很有用(我创建了一个脚本,一次性完成裁剪、面部模糊和水印,并且很难确定为什么模糊和水印文本从未出现过……)。
-2
oxxido at gmail dot com
9 年前
我有一个函数,它接收一个图像,调整大小并裁剪它,并将其保存为普通图像,然后再次调整大小并裁剪它以创建缩略图。第二次裁剪的数字完全错误,计算是完美的,问题是第二次裁剪没有重置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。
To Top