當裁切 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。