PHP 為圖片加上浮水印 (含浮水印透明背景處理)

PHP 要為圖片加上浮水印: 就是要將兩張圖合併在一起, 浮水印的圖片要蓋在上面.

現實狀況還會遇到原圖要縮圖後, 浮水印的圖片可能也要跟著縮圖, 這些部分再此就不寫了, 此部份縮圖可見此篇: PHP 對 透明背景的圖片 做縮圖

此篇只寫如何用 PHP GD 來合併圖片, 做浮水印功能.

PHP 為圖片加上浮水印 (含浮水印透明背景處理)

PHP 要為圖片加上浮水印 (兩張圖合併), 可用下述 Function:

  1. <?php
  2. imagecopymerge(原圖Resource, 浮水印圖Resource, 浮水印要放的目標位置x, 浮水印要放的目標位置y, 0, 0, 浮水印圖的寬度, 浮水印圖的高度, alpha transparency);
  3. ?>

但是上述若浮水印的圖片是透明背景、透明底圖, 透明部分就會變成一片黑, 若遇到此狀況, 可改用下述 Function: (用筆刷的方式一行一行刷上去)

  1. <?php
  2. // 浮水印的圖若是透明背景、透明底圖, 需要用下述兩行
  3. imagesetbrush(原圖Resource, 浮水印圖Resource);
  4. imageline(原圖Resource, $watermark_pos_x, $watermark_pos_y, $watermark_pos_x, $watermark_pos_y, IMG_COLOR_BRUSHED);
  5. ?>

為圖片加上浮水印的程式 Function

  1. <?php
  2. function watermark($from_filename, $watermark_filename, $save_filename)
  3. {
  4. $allow_format = array('jpeg', 'png', 'gif');
  5. $sub_name = $t = '';
  6. // 原圖
  7. $img_info = getimagesize($from_filename);
  8. $width    = $img_info['0'];
  9. $height   = $img_info['1'];
  10. $mime     = $img_info['mime'];
  11. list($t, $sub_name) = explode('/', $mime);
  12. if ($sub_name == 'jpg')
  13. $sub_name = 'jpeg';
  14. if (!in_array($sub_name, $allow_format))
  15. return false;
  16. $function_name = 'imagecreatefrom' . $sub_name;
  17. $image     = $function_name($from_filename);
  18. // 浮水印
  19. $img_info = getimagesize($watermark_filename);
  20. $w_width  = $img_info['0'];
  21. $w_height = $img_info['1'];
  22. $w_mime   = $img_info['mime'];
  23. list($t, $sub_name) = explode('/', $w_mime);
  24. if (!in_array($sub_name, $allow_format))
  25. return false;
  26. $function_name = 'imagecreatefrom' . $sub_name;
  27. $watermark = $function_name($watermark_filename);
  28. $watermark_pos_x = $width  - $w_width;
  29. $watermark_pos_y = $height - $w_height;
  30. // imagecopymerge($image, $watermark, $watermark_pos_x, $watermark_pos_y, 0, 0, $w_width, $w_height, 100);
  31. // 浮水印的圖若是透明背景、透明底圖, 需要用下述兩行
  32. imagesetbrush($image, $watermark);
  33. imageline($image, $watermark_pos_x, $watermark_pos_y, $watermark_pos_x, $watermark_pos_y, IMG_COLOR_BRUSHED);
  34. return imagejpeg($image, $save_filename);
  35. }
  36. ?>

使用範例: watermark('source.jpg', 'watermark.png', 's-and-w.jpg'); // s-and-w.jpg 就是合併完成的圖片

相關網頁

作者: Tsung

對新奇的事物都很有興趣, 喜歡簡單的東西, 過簡單的生活.

在〈PHP 為圖片加上浮水印 (含浮水印透明背景處理)〉中有 12 則留言

  1. 抱歉, 後來發現是用模擬成筆刷 (這功能太少用到了), 點 "1" 點在圖片上所以定義那一點的位置. 這浮水印真是不錯的方法.

    1. 不會啦,很感謝您的指教,有人能鞭策,才能夠一起進步。

      因為沒有想到做浮水印的好方法,於是只好用這招來做,不確定是不是好解法就是了~

  2. HI~
    關於您的浮水印用法,如果使用原本的方法可以將浮水印放置在右下角的位置

    imagecopymerge($image, $watermark, $watermark_pos_x, $watermark_pos_y, 0, 0, $w_width, $w_height, 100);

    但是用新方法卻不行放置右下角會有偏左或中間位置
    imagesetbrush($image, $watermark);
    imageline($image, $watermark_pos_x, $watermark_pos_y, $watermark_pos_x, $watermark_pos_y, IMG_COLOR_BRUSHED);

    是否有方法修正呢?
    謝謝

    1. 您可以寄給我範例程式嗎?

      照理說應該是位置寫得問題,不太會有偏左或中間,因為這是 1 vs 1 直接蓋上去而已

  3. HI
    我發現用新方法它imageline會從浮水印圖的中間點來開始
    所以我把您的程式碼改成如下就可以到正確的右下角位置了

    $watermark_pos_x = $width - ($w_width / 2);
    $watermark_pos_y = $height - ($w_height / 2);

    其他都不變
    以上謝謝

    1. 可以阿,你可以把原圖的透明底圖弄一個特殊的顏色,最後處理完後,再把那個顏色弄成透明底圖的 png 就好了~

  4. 請問一下,我依照您的程式 watermark(jpg圖,透明png, 自訂名稱.jpg),為什麼轉出來的jpg圖檔只看得到 {jpg原圖}呢?! {透明png}圖並沒有出現哩

發表迴響

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料