PHP Conference Nagoya 2025

Imagick::cropImage

(PECL imagick 2, PECL imagick 3)

Imagick::cropImageExtrai uma região da imagem

Descrição

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

Extrai uma região da imagem.

Parâmetros

width

A largura do recorte

height

A altura do recorte

x

A coordenada X do canto superior esquerdo da região recortada

y

A coordenada Y do canto superior esquerdo da região recortada

Valor Retornado

Retorna true em caso de sucesso.

Erros/Exceções

Lança uma exceção ImagickException em caso de erro.

Exemplos

Exemplo #1 Exemplo de 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();
}

?>

adicione uma nota

Notas Enviadas por Usuários (em inglês) 4 notes

up
17
Christian Dehning
14 years ago
When cropping gif-images (I had no problems with jpg and png images), the canvas is not removed. Please run the following command on the cropped gif, to remove the blank space:

$im->setImagePage(0, 0, 0, 0);
up
5
olav at schettler dot net
8 years ago
Here is a simple function to create a thumbnail. It accepts an additional parameter to set the focus point of the generated thumbnail:

<?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;
}
}
?>
up
5
ElPadre
14 years ago
Actually, the Imagick::setImagePage(0,0,0,0) is also handy with jpgs and pngs, if you plan to do any more changes on the cropped image that involves positioning and/or gravity (I created a script that does crop, face blur and watermarking in one go, and had a hell of a time determining why the blurs and the watermark text never showed up...).
up
-2
oxxido at gmail dot com
9 years ago
I have a function that takes an image, resize and crop it, and save it as normal, then resize it again and crop it again to create the thumbnail. The numbers of the second crop were WAY off, and the calculations were perfect, the problem, was the second crop wasn't resetting the imagePage, so if you try to crop the same image twice, it will be a good idea to reset it first:
<?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);

?>

BTW, i needed perfect dimentions so i had to set the "bestfit" to false.
To Top