在處理使用者上傳圖片時,加浮水印是保護版權、宣傳品牌的常見需求。本文提供一個功能完整的 WaterMask 類別,支援:
class WaterMask {
// 公開屬性:水印類型、位置、透明度、文字/圖片設定、字體、輸出路徑、是否畫矩形等
// 私有屬性:原圖/水印圖資源、圖資訊、水印座標、結果陣列
// 方法:__construct、imginfo、waterimginfo、waterpos、waterposStr、waterimg、waterstr、drawRectangle、output
}
public function __construct($img) {
if (file_exists($img)) {
$this->srcImg = $img;
} else {
return ['data' => '', 'info' => '源文件不存在!', 'status' => 0];
}
}
自動偵測原圖格式(PNG/JPEG/GIF)並建立 GD 圖片資源。
waterpos() 依 $this->pos (0-9) 計算水印左上角座標:
文字水印另有一專用 waterposStr() 置中偏下。
private function waterimg($type = '') {
// 建立暫存畫布,先複製原圖對應區域,再疊加水印圖,最後用 imagecopymerge 依透明度合成回原圖
}
private function waterstr() {
// 以 imagettfbbox 計算文字寬高,建立真彩畫布,開啟 alpha blending,填入透明背景,寫入文字,再轉為水印圖資源呼叫 waterimg()
}
public function drawRectangle() {
$color = imagecolorallocate($this->im, 255, 255, 255);
imagefilledrectangle($this->im, 3, $this->srcImg_info[1] - 20, $this->srcImg_info[0] - 3, $this->srcImg_info[1] - 3, $color);
}
固定繪製於圖片底部留白區域,可作為文字水印背景帶。
function output() {
$this->imginfo();
if ($this->is_draw_rectangle) $this->drawRectangle();
if ($this->waterTypeStr) $this->waterstr();
if ($this->waterTypeImage) { $this->waterimginfo(); $this->waterimg(); }
// 依原圖格式輸出 PNG/JPEG/GIF,銷毀資源,回傳狀態陣列
}
$file = '58368dddc8c51_22';
$file_ext = '.jpeg';
$imgFileName = './' . $file . $file_ext;
$obj = new WaterMask($imgFileName);
$obj->waterTypeStr = true; // 啟用文字水印
$obj->waterTypeImage = true; // 啟用圖片水印
$obj->pos = 9; // 位置:下中偏上
$obj->waterImg = './water.png';
$obj->transparent = 100; // 不透明
$obj->waterStr = '保險經紀人:劉測試 電話:02052552';
$obj->fontSize = 9;
$obj->fontColor = [0, 0, 0];
$obj->fontFile = './font/msyh.ttc'; // 微軟雅黑
$obj->is_draw_rectangle = true; // 開啟矩形背景
$obj->output_img = './' . $file . '_n' . $file_ext;
$obj->output();
此 WaterMask 類別封裝完整、參數靈活,可直接納入專案處理圖片水印需求,減少重複造輪子的時間。