在 CMS、電商、用戶頭像系統中,圖片處理是高頻剛需:生成多規格縮略圖、添加品牌水印、智能裁切、格式轉換等。本文分享一個功能完整的 ThumbHandler 類,基於 GD 庫封裝,支援:
class ThumbHandler {
// 核心屬性
private $h_src, $h_dst, $h_mask; // GD 資源句柄
private $src_w, $src_h; // 源圖尺寸
private $dst_w, $dst_h; // 目標尺寸
private $fill_w, $fill_h; // 實際繪製區域
private $copy_w, $copy_h; // 複製區域
private $src_x, $src_y; // 源圖起始座標
private $start_x, $start_y; // 目標起始座標
// 水印相關
private $mask_word, $mask_img;
private $mask_font, $mask_font_size, $mask_font_color;
private $mask_position, $mask_offset_x, $mask_offset_y;
private $mask_img_pct, $mask_txt_pct; // 透明度(0-100,值越大越不透明)
// 其他
private $cut_type; // 0=等比 1=自動裁切 2=手動裁切
private $img_type; // 文件類型
private $img_border_size, $img_border_color;
private $_flip_x, $_flip_y; // 翻轉計數
// 公開方法:setSrcImg, setDstImg, setMaskWord, setMaskImg, setCutType...
// 核心方法:createImg($width, $height?) -> bool
}
require_once 'ThumbHandler.php';
$t = new ThumbHandler();
$t->setSrcImg('uploads/photo.jpg');
$t->setDstImg('thumbs/photo_300.jpg');
// 單參數模式:作為百分比(1-100)或寬度像素
$t->createImg(300); // 生成寬 300px,高度等比縮放
$t->createImg(200, 200); // 強制 200x200
$t->setSrcImg('uploads/photo.jpg');
$t->setDstImg('thumbs/photo_square.jpg');
$t->setCutType(1); // 關鍵:啟用自動裁切
$t->createImg(150, 150); // 輸出 150x150 正方形
$t->setSrcImg('uploads/large.jpg');
$t->setDstImg('thumbs/crop.jpg');
$t->setCutType(2); // 手動裁切模式
$t->setSrcCutPosition(100, 50); // 源圖起始座標
$t->setRectangleCut(400, 300); // 裁切寬高
$t->createImg(400, 300); // 目標尺寸同裁切尺寸
$t->setSrcImg('uploads/photo.jpg');
$t->setDstImg('watermarked/photo.jpg');
$t->setMaskFont('fonts/simhei.ttf'); // TTF 字體路徑
$t->setMaskFontSize(24);
$t->setMaskFontColor('#FFFFFF');
$t->setMaskTxtPct(30); // 30% 不透明度(較淡)
$t->setMaskPosition(4); // 1=左上 2=左下 3=右上 4=右下
$t->setMaskOffsetX(10);
$t->setMaskOffsetY(10);
$t->setMaskWord('© MySite 2024');
$t->createImg(800, 600);
$t->setSrcImg('uploads/photo.jpg');
$t->setDstImg('watermarked/photo.jpg');
$t->setMaskImg('assets/logo.png'); // 建議 PNG 透明背景
$t->setMaskPosition(4); // 右下角
$t->setMaskImgPct(50); // 50% 透明度
$t->setMaskOffsetX(15);
$t->setMaskOffsetY(15);
$t->createImg(800);
$t->setSrcImg('uploads/photo.jpg');
$t->setDstImg('processed/photo.jpg');
$t->flipH(); // 水平翻轉
$t->flipV(); // 垂直翻轉(連續調用可疊加)
$t->setDstImgBorder(5, '#DDDDDD'); // 5px 灰色邊框
$t->createImg(600);
$text = "版權所有"; $str = mb_convert_encoding($text, "UTF-8", "gb2312"); // 視源文件編碼而定 $t->setMaskWord($str); // 或確保 PHP 文件本身為 UTF-8 無 BOM,直接寫中文
| 方法 | 說明 | 典型值 |
|---|---|---|
| setCutType(0/1/2) | 裁切模式:等比/自動/手動 | 1 |
| setMaskPosition(0-4) | 水印九宮格:0/4=右下 1=左上 2=左下 3=右上 | 4 |
| setMaskImgPct(0-100) | 圖片水印不透明度(值越大越實) | 50 |
| setMaskTxtPct(0-100) | 文字水印不透明度 | 30 |
| setImgCreateQuality(0-100) | 輸出圖片質量(JPG) | 100 |
| setImgDisplayQuality(0-100) | 瀏覽器直接輸出時質量 | 80 |
php -m | grep gd 檢查,需編譯 --with-gd 或安裝 php-gd 包mb_convert_encoding 處理編碼轉換setMaskImgPct 觸發自動縮放邏輯memory_limit,或分塊處理imagedestroy() 已在 createImg() 末尾自動釋放資源,無需手動調用Intervention/Image(Composer 包)獲得更現代化 API(鏈式調用、Laravel 集成)TinyPNG API、mozjpeg)ThumbHandler 以單文件、零依賴(僅需 GD)、功能全面著稱,適合中小型項目快速集成。掌握「設置源→配置參數→createImg()」三步流程,即可輕鬆實現縮略圖生成、水印保護、智能裁切等核心圖片處理需求。