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

織夢 CMS 圖片處理類 Image 完整解析:縮略圖生成與水印添加

     編輯:PHP 綜合知識

類定位

image 類是織夢 CMS 核心圖片處理組件,基於 GD 庫實現縮略圖生成與圖片/文字水印,支持 JPEG/GIF/PNG 格式,自動檢測動態 GIF 避免損壞動畫。

構造函數參數詳解

function __construct(
    $targetfile,        // 目標圖片路徑
    $cfg_thumb,         // 縮略圖模式:1=強制覆蓋原圖 2=生成單獨文件
    $cfg_watermarktext, // 文字水印配置數組
    $photo_waterpos,    // 水印位置 1-9(九宮格)
    $photo_diaphaneity, // 水印透明度 0-100
    $photo_wheight,     // 最小加水印高度
    $photo_wwidth,      // 最小加水印寬度
    $cfg_watermarktype, // 水印類型:1=PNG圖片 2=GIF圖片 3=文字
    $photo_marktrans,   // 圖片水印融合度
    $trueMarkimg,       // 水印圖片路徑
    $attach = array()   // 附加信息(如 size)
)

核心功能方法

1. thumb($width, $height, $preview=0) — 生成縮略圖

  • 調用 thumb_gd() 基於 imagecreatetruecolor + imagecopyresampled 高質量縮放
  • 保持原圖比例,短邊優先填滿
  • $cfg_thumb=1 時直接覆蓋原文件(生成 .thumb.jpg 備份);=2 時生成獨立文件
  • 若啟用水印($watermarkstatus),縮略後自動調用 watermark()

2. watermark($preview=0) — 添加水印

  • 檢查圖片尺寸是否達到最小閾值($watermarkminwidth/height)
  • 調用 watermark_gd() 實際繪製

3. watermark_gd() — 水印核心邏輯

// 九宮格位置計算
switch ($this->watermarkstatus) {
    case 1: $x=5; $y=5; break;           // 左上
    case 2: $x=($w-$lw)/2; $y=5; break;  // 上中
    case 3: $x=$w-$lw-5; $y=5; break;    // 右上
    case 4: $x=5; $y=($h-$lh)/2; break;  // 左中
    case 5: $x=($w-$lw)/2; $y=($h-$lh)/2; break; // 正中心
    case 6: $x=$w-$lw-5; $y=($h-$lh)/2; break; // 右中
    case 7: $x=5; $y=$h-$lh-5; break;    // 左下
    case 8: $x=($w-$lw)/2; $y=$h-$lh-5; break; // 下中
    case 9: $x=$w-$lw-5; $y=$h-$lh-5; break; // 右下
}

// 圖片水印(類型 1/2)
if ($type < 2) {
    $logo = $type==1 ? imagecreatefrompng($mark_file) : imagecreatefromgif($mark_file);
    imagecopy($dst, $logo, $x, $y, 0, 0, $lw, $lh);
}
// 文字水印(類型 2)
elseif ($type == 2) {
    // 支持陰影、字體、顏色、角度
    imagettftext($dst, $size, $angle, $x+$ax, $y+$ay, $color, $font, $text);
}
// 混合模式水印(類型 0,舊版兼容)
else {
    imagealphablending($logo, true);
    imagecopymerge($dst, $logo, $x, $y, 0, 0, $lw, $lh, $transparency);
}

關鍵特性與限制

特性支持情況備註
格式支持JPEG / GIF / PNG輸出格式跟隨輸入,JPEG 可指定質量
動態 GIF檢測並跳過處理避免破壞動畫,直接返回原圖
文字水印支持 TTF 字體、陰影、旋轉需服務器安裝 FreeType 並配置字體路徑
透明度控制0-100 可調圖片水印用 imagecopymerge,文字用 alpha 通道
內存安全及時 imagedestroy類中未顯式銷毀資源,長時間批量處理需手動釋放

使用示例

// 配置參數(通常從系統配置讀取)
$cfg = [
    'thumb' => 2,                    // 生成獨立縮略圖
    'watermarktext' => [
        'text' => 'Copyright © Demo',
        'fontpath' => '/fonts/msyh.ttf',
        'size' => 14,
        'color' => '255,255,255',
        'shadowx' => 1, 'shadowy' => 1,
        'shadowcolor' => '0,0,0',
        'angle' => 0
    ],
    'photo_waterpos' => 9,           // 右下角
    'photo_diaphaneity' => 50,       // 50% 透明度
    'photo_wheight' => 200,          // 最小 200px
    'photo_wwidth' => 200,
    'cfg_watermarktype' => 2,        // 文字水印
    'photo_marktrans' => 50,
    'trueMarkimg' => ''
];

$img = new image('/uploads/photo.jpg', ...$cfg);
$img->thumb(800, 600);   // 生成 800x600 內的縮略圖並加水印
// 或單獨加水印
// $img->watermark();

現代化替代建議

  • Intervention Image:composer require intervention/image,鏈式調用、支持 Imagine/GD/Imagick 多驅動、Laravel 集成完美。
  • Spatie Image Optimizer:專注無損壓縮,配合上傳流程自動優化。
  • 原生 GD/Imagick:若無框架依賴,直接使用 imagecreatetruecolor 等函數更輕量可控。

維護老織夢項目時,image 類仍能穩定工作,注意 PHP 8.1+ 中 GD 函數簽名變化(如 imagecreatefromjpeg 返回 GdImage 對象而非 resource)。

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