首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 圖片浮水印完整實作:上傳、處理、儲存一站式教學

     編輯:PHP 相關知識

功能需求

使用者上傳圖片 (JPG/GIF),系統自動加入 PNG 透明浮水印並儲存。支援隨機浮水印位置(左上/右下)。

完整程式碼 (watermark.php)

<?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="浮水印結果">';
}
?>

HTML 上傳表單

<!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>

關鍵技術點解析

  1. imagealphablending(true):開啟混合模式,讓浮水印透明度生效
  2. imagesavealpha(true):儲存時保留 Alpha 通道
  3. imagecopy():將浮水印像素複製到目標圖片指定座標
  4. 隨機位置:避免浮水印被批量裁切移除

進階擴充建議

  • 支援文字浮水印 (`imagettftext`)
  • 多浮水印圖層疊加
  • 浮水印透明度可調 (`imagefilter` + `IMG_FILTER_COLORIZE`)
  • 整合至上傳類別,支援多檔案批次處理
  • 使用 Intervention Image 等現代函式庫簡化操作

安全性提醒

  • 嚴格驗證 MIME 類型與副檔名
  • 限制上傳檔案大小 (`upload_max_filesize`)
  • 儲存路徑避免可直接執行 PHP 腳本
  • 檔案重命名避免覆蓋與注入攻擊
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved