圖片處理是 Web 開發高頻剛需:用戶頭像裁剪、商品圖水印、文章配圖多規格縮略圖。本文深度剖析兩款經典 PHP 圖片處理類的架構設計,對比其在水印疊加、等比縮放、固定尺寸裁剪、智能裁剪壓縮四大核心功能上的實現差異,並給出生產環境優化建議。
Image_process 類 —— 輕量直觀的功能封裝採用單類封裝,構造函數自動探測源圖信息,方法鏈式調用風格。
<?php
class Image_process {
// 構造函數:自動獲取寬高、類型、路徑
public function __construct($source) {
$info = getimagesize($source);
$this->source_width = $info[0];
$this->source_height = $info[1];
$this->source_type_id = $info[2]; // 1=gif, 2=jpg, 3=png
// ...
}
// 統一圖片資源創建入口(工廠模式雛形)
private function judgeType($type, $source) {
return match($type) {
1 => imagecreatefromgif($source),
2 => imagecreatefromjpeg($source),
3 => imagecreatefrompng($source),
default => false
};
}
// 水印:居中疊加
public function waterMakeImage($logo) {
$src = $this->judgeType($this->source_type_id, $this->orign_url);
$logoRes = $this->judgeType($logo_type_id, $logo);
$x = ($this->source_width - $logo_width) / 2;
$y = ($this->source_height - $logo_height) / 2;
imagecopy($src, $logoRes, $x, $y, 0, 0, $logo_width, $logo_height);
// 保存...
}
// 等比縮放
public function scaleImage($scale) {
$w = floor($this->source_width * $scale);
$h = floor($this->source_height * $scale);
$this->tinyImage($w, $h);
}
// 固定尺寸(強制拉伸)
public function fixSizeImage($w, $h) {
$this->tinyImage($w, $h);
}
// 核心縮略圖生成
private function tinyImage($w, $h) {
$dst = imagecreatetruecolor($w, $h);
$src = $this->judgeType($this->source_type_id, $this->orign_url);
// 優先使用重採樣(質量更高)
imagecopyresampled($dst, $src, 0,0, 0,0, $w,$h, $this->source_width, $this->source_height);
// 保存...
}
}
?>
Img 類 —— 功能更豐富的企業級組件採用靜態工具類風格,功能覆蓋智能裁剪壓縮、等比縮放、水印(支持透明度/位置)、目錄自動創建、異常處理。
thumb_img()解決「圖片過長/過寬導致變形」問題:先按目標比例裁剪源圖,再等比縮放。
<?php
public function thumb_img($src_img, $save_img, $option) {
// 1. 計算源圖與目標長寬比
$dst_scale = $option['height'] / $option['width'];
$src_scale = $src_h / $src_w;
// 2. 確定裁剪區域(保持內容主體居中)
if ($src_scale >= $dst_scale) { // 過高:左右裁剪
$w = $src_w;
$h = $dst_scale * $w;
$x = 0;
$y = ($src_h - $h) / 3; // 黃金分割點偏上,適合人臉識別
} else { // 過寬:上下裁剪
$h = $src_h;
$w = $h / $dst_scale;
$x = ($src_w - $w) / 2;
$y = 0;
}
// 3. 執行裁剪 -> 縮放 -> 輸出
$croped = imagecreatetruecolor($w, $h);
imagecopy($croped, $source, 0, 0, $x, $y, $src_w, $src_h); // 裁剪
imagecopyresampled($target, $croped, 0,0, 0,0, $dst_w,$dst_h, $w,$h); // 縮放
// ...
}
?>
water_mark() 參數化控制<?php
public function water_mark($org_img, $mark_img, $save_img, $option = []) {
// 位置計算:默認右下角,支持自定義 x/y
$x = $option['x'] ?? ($org_w - $mark_w);
$y = $option['y'] ?? ($org_h - $mark_h);
// 邊界保護
$x = max(0, min($x, $org_w));
$y = max(0, min($y, $org_h));
// 透明度:0-100,默認 50
$alpha = max(0, min(100, $option['alpha'] ?? 50));
// 合成
imagecopymerge($org_img_im, $mark_img_im, $x, $y, 0, 0, $mark_w, $mark_h, $alpha);
// ...
}
?>
| 特性 | Image_process | Img |
|---|---|---|
| 架構風格 | 實例化綁定源圖 | 靜態方法傳入路徑 |
| 智能裁剪 | ❌ 無 | ✅ 核心亮點 |
| 水印控制 | 僅居中 | 位置、透明度可配置 |
| 格式支持 | GIF/JPG/PNG | + BMP |
| 錯誤處理 | 返回 false | 統一返回 ['flag', 'msg'] 結構 |
| 目錄管理 | 手動 mkdir | 自動遞歸創建 |
| 內存管理 | 基礎 imagedestroy | 完整資源銷毀流程 |
Image::make()->fit(300,200)->save())。finfo_file),禁用執行權限,文件名隨機化。Image_process 適合簡單項目快速集成,Img 類的智能裁剪與結構化錯誤處理更適合企業級應用。現代開發建議直接站在巨人肩膀上使用 Intervention/Image 或 Spatie/Image,專注業務邏輯而非重複造輪子。