首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP Imagick 圖片處理實戰:縮放、裁剪、壓縮、GIF 幂處理、水印與濾鏡全集成

     編輯:PHP 相關知識

類庫概覽

封裝 Imagick 擴展,提供統一入口 ImagickService,支援:
• 智能縮放/裁剪(保持比例、居中/頂部裁剪)
• GIF 幂級逐幀處理(保持動畫、延遲、透明度)
• 壓縮輸出(JPEG 質量自適應、Strip 元數據)
• 文字/圖片水印(支援 GIF 疊加)
• 多種濾鏡(模糊、銳化、噪點、色階、素描、油畫等)
• 翻轉、邊框、格式轉換

核心方法詳解

1. 智能縮放裁剪 resize($width, $height)

  • 單邊為 0 → 等比縮放另一邊自適應
  • 雙邊非 0 → 計算目標比例,短邊放大、長邊居中裁剪
  • GIF 走專用 _resizeGif() 逐幀處理

2. GIF 專用處理 _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;

3. 壓縮輸出 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);

4. 多模式縮放 resize_to($w, $h, $fit, $fill_color)

5. 水印與文字

  • add_watermark($path, $x, $y):圖片水印,GIF 逐幂疊加
  • add_text($text, $x, $y, $angle, $style):文字水印,$style 支援 font、font_size、fill_color、under_color

6. 豐富濾鏡

blur($radius, $sigma)           // 模糊
gaussian_blur($radius, $sigma)  // 高斯模糊
motion_blur($radius, $sigma, $angle) // 運動模糊
radial_blur($radius)            // 徑向模糊
add_noise($type)                // 噪點
level($black, $gamma, $white)   // 色階
modulate($brightness, $saturation, $hue) // 亮度/飽和度/色調
charcoal($radius, $sigma)       // 素描
oil_paint($radius)              // 油畫
flop() / flip()                 // 水平/垂直翻轉
border($width, $height, $color) // 邊框

使用示例

<?php
require 'ImagickService.php';

$img = new ImagickService();
$img->open('upload/photo.jpg')
    ->resize_to(800, 600, 'center')      // 智能裁剪 800x600
    ->add_watermark('logo.png', 10, 10)  // 右下角水印
    ->add_text('© MySite', 20, 20, 0, ['font_size'=>16, 'fill_color'=>'rgba(255,255,255,0.8)'])
    ->save_to('static/photo_800x600.jpg');

echo "處理完成";
?>

部署注意事項

  1. 安裝 ImageMagick + php-imagick 擴展,版本對應(如 IM 7.x 對應 imagick 3.4+)。
  2. 內存限制:處理大圖/多幂 GIF 易超 memory_limit,建議 ini_set('memory_limit', '512M')。
  3. 線程安全:PHP-FPM 多進程下 Imagick 非線程安全,僅在 CLI 或單進程模式大量併發時需加鎖/隊列。
  4. 臨時文件:大圖處理會產生大量臨時文件,關注 MAGICK_TEMPORARY_PATH 磁盤空間。

此類庫已在生產環境穩定運行,支撐日均百萬級圖片處理,歡迎根據業務擴展。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
$fit 值行為
force強制拉伸至 $w×$h
scale等比縮放進安全框,不裁剪
scale_fill等比縮放 + 填充背景色至 $w×$h
center/north/south/west/east/...等比放大至覆蓋安全框,按九宮格方位裁剪