萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 網路程式設計 >> PHP 程式設計

PHP 多功能水印類:支援圖片、文字、矩形填色與自訂位置

前言

在處理使用者上傳圖片時,加浮水印是保護版權、宣傳品牌的常見需求。本文提供一個功能完整的 WaterMask 類別,支援:

  • 文字水印(可設字體、大小、顏色、透明度)
  • 圖片水印(支援 PNG/JPG/GIF,含透明度合成)
  • 矩形區域填色(可作為文字水印背景)
  • 9 種預設位置 + 隨機位置,並可自訂座標
  • 輸出覆蓋原檔或另存新檔

類別架構概覽

class WaterMask {
    // 公開屬性:水印類型、位置、透明度、文字/圖片設定、字體、輸出路徑、是否畫矩形等
    // 私有屬性:原圖/水印圖資源、圖資訊、水印座標、結果陣列
    // 方法:__construct、imginfo、waterimginfo、waterpos、waterposStr、waterimg、waterstr、drawRectangle、output
}

核心功能說明

1. 建構子與圖片載入

public function __construct($img) {
    if (file_exists($img)) {
        $this->srcImg = $img;
    } else {
        return ['data' => '', 'info' => '源文件不存在!', 'status' => 0];
    }
}

自動偵測原圖格式(PNG/JPEG/GIF)並建立 GD 圖片資源。

2. 水印位置演算法

waterpos() 依 $this->pos (0-9) 計算水印左上角座標:

  • 0:隨機
  • 1-9:對應左上、上中、右上、中左、正中、中右、左下、下中、下中偏上 100px、右下

文字水印另有一專用 waterposStr() 置中偏下。

3. 圖片水印合成

private function waterimg($type = '') {
    // 建立暫存畫布,先複製原圖對應區域,再疊加水印圖,最後用 imagecopymerge 依透明度合成回原圖
}

4. 文字水印繪製

private function waterstr() {
    // 以 imagettfbbox 計算文字寬高,建立真彩畫布,開啟 alpha blending,填入透明背景,寫入文字,再轉為水印圖資源呼叫 waterimg()
}

5. 矩形區域填色

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);
}

固定繪製於圖片底部留白區域,可作為文字水印背景帶。

6. 輸出圖片

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();

注意事項

  1. 伺服器需安裝 GD 擴展並支援 FreeType(文字水印)。
  2. 字體檔路徑請確認存在,否則文字水印會失敗。
  3. 水印圖尺寸不得大於原圖,否則會回傳錯誤。
  4. 輸出路徑目錄需可寫入。

總結

此 WaterMask 類別封裝完整、參數靈活,可直接納入專案處理圖片水印需求,減少重複造輪子的時間。

copyright © 萬盛學電腦網 all rights reserved