封裝 Imagick 擴展,提供統一入口 ImagickService,支援:
• 智能縮放/裁剪(保持比例、居中/頂部裁剪)
• GIF 幂級逐幀處理(保持動畫、延遲、透明度)
• 壓縮輸出(JPEG 質量自適應、Strip 元數據)
• 文字/圖片水印(支援 GIF 疊加)
• 多種濾鏡(模糊、銳化、噪點、色階、素描、油畫等)
• 翻轉、邊框、格式轉換
resize($width, $height)_resizeGif() 逐幀處理_resizeGif()// 核心邏輯:遍歷每幂,合成到透明畫布 → 縮放/裁剪 → 保持延遲/處置方法 → 重組動畫
$dest = new Imagick();
foreach ($this->image as $frame) {
$page = $frame->getImagePage();
$tmp = new Imagick();
$tmp->newImage($page['width'], $page['height'], new ImagickPixel('transparent'), 'gif');
$tmp->compositeImage($frame, Imagick::COMPOSITE_OVER, $page['x'], $page['y']);
$tmp->thumbnailImage($t_w, $t_h, true);
if ($isCrop) $tmp->cropImage($c_w, $c_h, $c_x, $c_y);
$dest->addImage($tmp);
$dest->setImagePage($tmp->getImageWidth(), $tmp->getImageHeight(), 0, 0);
$dest->setImageDelay($frame->getImageDelay());
$dest->setImageDispose($frame->getImageDispose());
}
$this->image->destroy();
$this->image = $dest;
save_to($path)$this->image->setImageFormat('JPEG');
$this->image->setImageCompression(Imagick::COMPRESSION_JPEG);
$quality = $this->image->getImageCompressionQuality() * 0.6;
$quality = $quality ?: 60;
$this->image->setImageCompressionQuality($quality);
$this->image->stripImage(); // 移除 EXIF 等元數據
// GIF 用 writeImages,其它用 writeImage
$this->image->writeImages($path, true);
resize_to($w, $h, $fit, $fill_color)| $fit 值 | 行為 |
|---|---|
force | 強制拉伸至 $w×$h |
scale | 等比縮放進安全框,不裁剪 |
scale_fill | 等比縮放 + 填充背景色至 $w×$h |
center/north/south/west/east/... | 等比放大至覆蓋安全框,按九宮格方位裁剪 |