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

PHP 圖片加水印完整實現方案

     編輯:PHP 綜合知識

圖片水印是保護圖片版權、品牌推廣的常用手段。本文提供一個功能完整、支援 PNG/JPG/GIF 多種格式的 PHP 水印類,包含位置控制、透明度調節、錯誤處理等實用功能。

核心功能特性

  • 支援主流圖片格式:PNG、JPG、GIF
  • 5 種水印位置:左上、右上、居中、左下、右下
  • 可調透明度(0-100)
  • 完善的錯誤代碼返回機制
  • 自動識別圖片類型並調用對應 GD 函數

完整實現代碼

<?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結果圖片保存失敗

使用注意事項

  1. 確保 PHP 啟用 GD 擴展且支援相應圖片格式
  2. 水印圖建議使用透明背景的 PNG 格式
  3. 目標目錄需有寫入權限
  4. 大圖片處理時注意 memory_limit 設置

相關專題推薦

更多 PHP 圖形圖片處理技巧,請參考:《PHP 圖形與圖片操作技巧匯總》、《PHP GD 庫完整指南》、《PHP 圖片處理最佳實踐》等專題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved