圖片水印如何添加?GD庫圖像處理詳細教程

使用phpGD庫可以靈活地為圖片添加水印。1. 首先確保環境支持gd庫,并建議使用png格式的水印圖片;2. 使用imagettftext()函數可直接添加文字水印,通過imagecolorallocate()設置顏色和透明度;3. 通過加載主圖和水印圖并調用imagecopymerge()函數實現圖片水印疊加,調整參數控制位置和透明度;4. 可編寫邏輯自動判斷水印位置或批量處理圖片,操作完成后需釋放資源以避免內存占用過高。

圖片水印如何添加?GD庫圖像處理詳細教程

圖片添加水印其實并不難,尤其是用PHP的GD庫來處理圖像時,可以通過代碼靈活控制水印的位置、透明度和樣式。只要你掌握了基本方法,就能在生成縮略圖或上傳用戶頭像等場景中輕松應用。

圖片水印如何添加?GD庫圖像處理詳細教程


1. 準備工作:確認環境支持GD庫

在開始之前,要確保你的PHP環境已經開啟了GD庫擴展。你可以通過執行 phpinfo() 函數查看是否加載了GD模塊。如果沒有開啟,需要在 php.ini 中啟用 extension=gd 并重啟服務器。

圖片水印如何添加?GD庫圖像處理詳細教程

另外,建議使用PNG格式的水印圖片,因為它支持透明通道,能更好地融合到背景圖中。


2. 添加文字水印:簡單高效的方式

如果你不想準備額外的水印圖片,可以直接在圖片上添加文字水印。GD庫提供了 imagettftext() 函數,可以使用自定義字體進行繪制。

圖片水印如何添加?GD庫圖像處理詳細教程

示例代碼:

// 創建原始圖片資源 $src = imagecreatefromjpeg('photo.jpg');  // 設置字體路徑和顏色 $font = 'arial.ttf'; $color = imagecolorallocate($src, 255, 255, 255); // 白色  // 添加文字水印 imagettftext($src, 20, 0, 20, 40, $color, $font, 'MySite.com');  // 輸出并釋放資源 imagejpeg($src, 'watermarked.jpg'); imagedestroy($src);
  • 文字大小、角度、位置都可以根據需求調整。
  • 顏色可以用 imagecolorallocate() 自定義。
  • 如果想讓文字半透明,可以先設置畫布的 alpha 混合模式。

3. 添加圖片水印:更靈活也更實用

如果你希望水印是一個LOGO或者特定圖形,就需要用圖片疊加的方式。GD庫提供了函數來合并兩張圖片。

示例步驟如下:

  • 加載主圖和水印圖
  • 獲取它們的寬高信息
  • 使用 imagecopymerge() 合并圖像,并設置透明度

代碼片段:

// 主圖 $main = imagecreatefromjpeg('photo.jpg');  // 水印圖(最好是PNG) $watermark = imagecreatefrompng('logo.png');  // 獲取尺寸 $main_w = imagesx($main); $main_h = imagesy($main); $wm_w = imagesx($watermark); $wm_h = imagesy($watermark);  // 右下角位置 $pos_x = $main_w - $wm_w - 10; $pos_y = $main_h - $wm_h - 10;  // 合并圖像,透明度設為50% imagecopymerge($main, $watermark, $pos_x, $pos_y, 0, 0, $wm_w, $wm_h, 50);  // 保存結果 imagejpeg($main, 'watermarked.jpg');  // 釋放資源 imagedestroy($main); imagedestroy($watermark);
  • 調整 imagecopymerge() 的最后一個參數可以控制水印的“明顯程度”。
  • 建議把水印放在右下角或不影響主體內容的地方。
  • PNG格式的水印圖能保留透明背景,效果更好。

4. 小技巧:自動判斷水印位置或批量處理

有時候你可能希望根據圖片大小自動決定水印的位置,比如居中、左上角或右下角。可以通過簡單的條件判斷實現。

例如:

switch ($position) {     case 'top-left':         $pos_x = 10;         $pos_y = 10;         break;     case 'bottom-right':         $pos_x = $main_w - $wm_w - 10;         $pos_y = $main_h - $wm_h - 10;         break; }

如果你要做批量處理,可以把上面的邏輯封裝成一個函數,傳入原圖路徑、水印類型、位置等參數,統一輸出加過水印的圖片。


基本上就這些操作了。雖然看起來有點代碼量,但實際只要理解每個函數的作用,就可以靈活運用。關鍵是記得處理完資源后要用 imagedestroy() 釋放內存,避免服務器負載過高。

? 版權聲明
THE END
喜歡就支持一下吧
點贊7 分享