使用者上傳圖片 (JPG/GIF),系統自動加入 PNG 透明浮水印並儲存。支援隨機浮水印位置(左上/右下)。
<?php
// 設定上傳參數
$allowedTypes = ['image/jpeg', 'image/pjpeg', 'image/gif'];
$waterMarkPath = 'watermark.png'; // 必須為 PNG 透明圖片
$uploadDir = 'uploads/';
if (!is_dir($uploadDir)) mkdir($uploadDir, 0755, true);
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['upfile'])) {
$file = $_FILES['upfile'];
// 驗證檔案類型
if (!in_array($file['type'], $allowedTypes)) {
die('不支援的檔案格式,僅限 JPG/GIF');
}
// 載入原圖
$srcImg = match($file['type']) {
'image/jpeg', 'image/pjpeg' => imagecreatefromjpeg($file['tmp_name']),
'image/gif' => imagecreatefromgif($file['tmp_name']),
default => null
};
if (!$srcImg) die('圖片讀取失敗');
// 開啟 Alpha 混合模式
imagealphablending($srcImg, true);
imagesavealpha($srcImg, true);
// 載入浮水印
$waterImg = imagecreatefrompng($waterMarkPath);
if (!$waterImg) die('浮水印圖片讀取失敗');
$srcW = imagesx($srcImg);
$srcH = imagesy($srcImg);
$waterW = imagesx($waterImg);
$waterH = imagesy($waterImg);
// 隨機位置:左上或右下
$positions = [
[5, 5], // 左上
[$srcW - $waterW - 5, $srcH - $waterH - 5] // 右下
];
[$dstX, $dstY] = $positions[random_int(0, 1)];
// 合成浮水印
imagecopy($srcImg, $waterImg, $dstX, $dstY, 0, 0, $waterW, $waterH);
// 輸出處理後圖片
$destPath = $uploadDir . basename($file['name']);
switch ($file['type']) {
case 'image/jpeg':
case 'image/pjpeg':
imagejpeg($srcImg, $destPath, 90);
break;
case 'image/gif':
imagegif($srcImg, $destPath);
break;
}
// 釋放資源
imagedestroy($srcImg);
imagedestroy($waterImg);
echo '<p>處理完成!</p>';
echo '<img src="' . $destPath . '" alt="浮水印結果">';
}
?>
<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><title>圖片浮水印上傳</title></head>
<body>
<form action="watermark.php" method="post" enctype="multipart/form-data">
<label>選擇圖片 (JPG/GIF):</label>
<input type="file" name="upfile" accept="image/jpeg,image/gif" required>
<button type="submit">上傳並加浮水印</button>
</form>
</body>
</html>