Imagick::cropImage

(PECL imagick 2, PECL imagick 3)

Imagick::cropImage截图图片的一块区域

说明

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

截图图片的一块区域

参数

width

截图的宽度

height

截图的高度

x

裁剪区域左上角的 X 轴坐标(以原图的左上角为原点)

y

裁剪区域左上角的 X 轴坐标(以原图的左上角为原点)

返回值

成功时返回 true

错误/异常

错误时抛出 ImagickException。

范例

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

?>

User Contributed Notes

olav at schettler dot net 30-Mar-2016 08:06
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;
    }
}
?>
oxxido at gmail dot com 13-Apr-2015 05:58
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.
ElPadre 05-Nov-2010 08:55
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...).
Christian Dehning 09-Apr-2010 03:57
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);
vincent dot hoen at gmail dot com 02-Aug-2007 06:35
There is an easiest way to crop an image : 

$picture = new Imagick('animated_gif.gif');

foreach($picture as $frame){
    $frame->cropImage($width, $height, $x, $y);
}