圖片水印是保護圖片版權、品牌推廣的常用手段。本文提供一個功能完整、支援 PNG/JPG/GIF 多種格式的 PHP 水印類,包含位置控制、透明度調節、錯誤處理等實用功能。
<?php
/**
* 圖片加水印
* @param string $srcImg 原圖路徑
* @param string $waterImg 水印圖路徑
* @param string $savepath 保存目錄
* @param string $savename 保存文件名
* @param int $position 水印位置 1-5
* @param int $alpha 透明度 0-100
* @return string|int 成功返回新圖路徑,失敗返回錯誤碼
*/
function img_water_mark($srcImg, $waterImg, $savepath=null, $savename=null, $position=5, $alpha=30) {
// 解析路徑信息
$temp = pathinfo($srcImg);
$name = $temp['basename'];
$path = $temp['dirname'];
$exte = $temp['extension'];
$savename = $savename ? $savename : $name;
$savepath = $savepath ? $savepath : $path;
$savefile = $savepath . '/' . $savename;
// 獲取圖片信息
$srcinfo = @getimagesize($srcImg);
if (!$srcinfo) return -1; // 原文件不存在
$waterinfo = @getimagesize($waterImg);
if (!$waterinfo) return -2; // 水印文件不存在
// 創建圖片資源
$srcImgObj = image_create_from_ext($srcImg);
if (!$srcImgObj) return -3; // 原圖資源創建失敗
$waterImgObj = image_create_from_ext($waterImg);
if (!$waterImgObj) return -4; // 水印資源創建失敗
// 計算水印坐標
switch ($position) {
case 1: $x = $y = 0; break; // 左上
case 2: $x = $srcinfo[0] - $waterinfo[0]; $y = 0; break; // 右上
case 3: $x = ($srcinfo[0] - $waterinfo[0]) / 2;
$y = ($srcinfo[1] - $waterinfo[1]) / 2; break; // 居中
case 4: $x = 0; $y = $srcinfo[1] - $waterinfo[1]; break; // 左下
case 5: $x = $srcinfo[0] - $waterinfo[0];
$y = $srcinfo[1] - $waterinfo[1]; break; // 右下(默認)
default: $x = $y = 0;
}
// 合併圖片
imagecopymerge($srcImgObj, $waterImgObj, $x, $y, 0, 0, $waterinfo[0], $waterinfo[1], $alpha);
// 根據原圖類型保存
switch ($srcinfo[2]) {
case 1: imagegif($srcImgObj, $savefile); break;
case 2: imagejpeg($srcImgObj, $savefile); break;
case 3: imagepng($srcImgObj, $savefile); break;
default: return -5; // 保存失敗
}
// 釋放資源
imagedestroy($srcImgObj);
imagedestroy($waterImgObj);
return $savefile;
}
/**
* 根據副檔名創建圖片資源
*/
function image_create_from_ext($imgfile) {
$info = getimagesize($imgfile);
switch ($info[2]) {
case 1: return imagecreatefromgif($imgfile);
case 2: return imagecreatefromjpeg($imgfile);
case 3: return imagecreatefrompng($imgfile);
}
return null;
}
// 使用示例
echo img_water_mark(
"source.jpg", // 原圖
"watermark.png", // 水印圖
null, // 保存目錄(默認同目錄)
"marked.jpg", // 保存文件名
5, // 右下角
60 // 60% 透明度
);
?>
| 代碼 | 含義 |
|---|---|
| -1 | 原圖文件不存在 |
| -2 | 水印圖片不存在 |
| -3 | 原圖 GD 資源創建失敗 |
| -4 | 水印 GD 資源創建失敗 |
| -5 | 結果圖片保存失敗 |
更多 PHP 圖形圖片處理技巧,請參考:《PHP 圖形與圖片操作技巧匯總》、《PHP GD 庫完整指南》、《PHP 圖片處理最佳實踐》等專題。