使用php的GD庫可以靈活地為圖片添加水印。1. 首先確保環境支持gd庫,并建議使用png格式的水印圖片;2. 使用imagettftext()函數可直接添加文字水印,通過imagecolorallocate()設置顏色和透明度;3. 通過加載主圖和水印圖并調用imagecopymerge()函數實現圖片水印疊加,調整參數控制位置和透明度;4. 可編寫邏輯自動判斷水印位置或批量處理圖片,操作完成后需釋放資源以避免內存占用過高。
圖片添加水印其實并不難,尤其是用PHP的GD庫來處理圖像時,可以通過代碼靈活控制水印的位置、透明度和樣式。只要你掌握了基本方法,就能在生成縮略圖或上傳用戶頭像等場景中輕松應用。
1. 準備工作:確認環境支持GD庫
在開始之前,要確保你的PHP環境已經開啟了GD庫擴展。你可以通過執行 phpinfo() 函數查看是否加載了GD模塊。如果沒有開啟,需要在 php.ini 中啟用 extension=gd 并重啟服務器。
另外,建議使用PNG格式的水印圖片,因為它支持透明通道,能更好地融合到背景圖中。
2. 添加文字水印:簡單高效的方式
如果你不想準備額外的水印圖片,可以直接在圖片上添加文字水印。GD庫提供了 imagettftext() 函數,可以使用自定義字體進行繪制。
示例代碼:
// 創建原始圖片資源 $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() 釋放內存,避免服務器負載過高。