在開發 CMS 或圖片處理系統時,為圖片加上水印是常見需求。網路上雖有許多現成類別,但往往難以滿足特定專案的彈性需求。本文介紹一個自行開發的 WaterMask 類別,支援文字與圖片兩種水印模式,提供透明度、位置、字體、顏色等豐富設定,並附上完整原始碼與使用範例。
WaterMask 封裝了水印生成的所有邏輯,主要屬性如下:
$waterType:水印類型(0=文字,1=圖片,預設 1)$pos:水印位置(0=隨機,1~9 對應九宮格)$transparent:透明度(0~100,預設 45)$waterStr:文字水印內容$fontSize、$fontColor、$fontFile:字體大小、RGB 顏色、TTF 字體檔$waterImg:圖片水印檔案路徑function __construct($img) {
$this->srcImg = file_exists($img) ? $img : die('"'.$img.'" 對不起,水印文件不存在!');
}
建構子接收目標圖片路徑,若檔案不存在則終止腳本。
imginfo() / waterimginfo()根據 getimagesize() 回傳的 MIME 型別(1=GIF, 2=JPEG, 3=PNG),分別呼叫 imagecreatefromgif/jpeg/png 建立 GD 資源,不支援格式則報錯。
waterpos()依 $pos 計算水印左上角座標 ($x, $y)。九宮格位置對應:
| 值 | 位置 |
|---|---|
| 0 | 隨機 |
| 1 | 左上 |
| 2 | 上中 |
| 3 | 右上 |
| 4 | 中左 |
| 5 | 正中 |
| 6 | 中右 |
| 7 | 左下 |
| 8 | 下中 |
| 9 | 右下 |
waterimg()先檢查水印尺寸不得大於原圖。利用 imagecreatetruecolor 建立暫存畫布,將原圖對應區域複製進去,再疊加水印圖片,最後用 imagecopymerge 依透明度合成回原圖。
waterstr()使用 imagettfbbox 計算文字邊界框,建立透明底圖,以 imagettftext 繪製文字,再轉呼叫 waterimg() 完成合成。
output()依水印類型分派處理,最後根據原圖格式輸出(PNG/JPEG/GIF),並銷毀 GD 資源。
$obj = new WaterMask('photo.jpg');
$obj->waterType = 1; // 圖片水印
$obj->transparent = 45; // 透明度
$obj->waterImg = 'logo.png'; // 水印圖片
$obj->pos = 9; // 右下角
$obj->output(); // 直接覆蓋輸出
若需文字水印,將 waterType 設為 0,並設定 waterStr、fontSize、fontColor、fontFile 即可。
此類別結構清晰、功能完整,適合直接整合至專案或作為二次開發基礎。透過封裝 GD 底層操作,開發者可專注於業務邏輯,快速實現圖片保護與品牌標識需求。