ID: 1

北京
搬砖小工

作者更多日志

laravel 添加水印图片

7个月前 102 0 已同步到节点LaravelLaravel

通用

新建/app/Handlers/WaterMark.php


<?php

/**
 * $groundImage:背景图片,即需要加水印的图片,暂只支持GIF,JPG,PNG格式
 * $waterPos:水印位置,有10种状态,0为随机位置 1为顶端居左,2为顶端居中,3为顶端居右; * 4为中部居左,5为中部居中,6为中部居右; * 7为底端居左,8为底端居中,9为底端居右
 * $waterImage:图片水印,即作为水印的图片,暂只支持GIF,JPG,PNG格式
 * $waterText:文字水印,即把文字作为为水印,支持ASCII码,不支持中文
 * $textFont:文字大小,值为1、2、3、4或5,默认为5
 * $textColor:文字颜色,值为十六进制颜色值,默认为#FF0000(红色)
 *
 * @return void
 */

namespace App\Handlers;

class WaterMark
{
    public function imageWaterMark($groundImage, $waterPos = 0, $waterImage = "", $waterText = "", $textFont = 5, $textColor = "#FF0000") {
      $isWaterImage = FALSE;
      $formatMsg = "暂不支持该文件格式,请用图片处理软件将图片转换为GIF、JPG、PNG格式。";
      //读取水印文件
      if (!empty($waterImage) && file_exists($waterImage)) {
          $isWaterImage = TRUE;
          $water_info = getimagesize($waterImage);
          $water_w = $water_info[0]; //取得水印图片的宽
          $water_h = $water_info[1]; //取得水印图片的高
          switch ($water_info[2]) {//取得水印图片的格式
              case 1:$water_im = imagecreatefromgif($waterImage);
                  break;
              case 2:$water_im = imagecreatefromjpeg($waterImage);
                  break;
              case 3:$water_im = imagecreatefrompng($waterImage);
                  break;
              default:die($formatMsg);
          }
      }
      //读取背景图片
      if (!empty($groundImage) && file_exists($groundImage)) {
          $ground_info = getimagesize($groundImage);
          $ground_w = $ground_info[0]; //取得背景图片的宽
          $ground_h = $ground_info[1]; //取得背景图片的高
          switch ($ground_info[2]) {//取得背景图片的格式
              case 1:$ground_im = imagecreatefromgif($groundImage);
                  break;
              case 2:$ground_im = imagecreatefromjpeg($groundImage);
                  break;
              case 3:$ground_im = imagecreatefrompng($groundImage);
                  break;
              default:die($formatMsg);
          }
      } else {
          die("需要加水印的图片不存在!");
      }
      //水印位置
      if ($isWaterImage) {//图片水印
          $w = $water_w;
          $h = $water_h;
          $label = "图片的";
      } else {//文字水印
          $temp = imagettfbbox(ceil($textFont * 5), 0, "./cour.ttf", $waterText); //取得使用 TrueType 字体的文本的范围
          $w = $temp[2] - $temp[6];
          $h = $temp[3] - $temp[7];
          unset($temp);
          $label = "文字区域";
      }
      if (($ground_w < $w) || ($ground_h < $h)) {
          echo "需要加水印的图片的长度或宽度比水印" . $label . "还小,无法生成水印!";
          return;
      }
      switch ($waterPos) {
          case 0://随机
              $posX = rand(0, ($ground_w - $w));
              $posY = rand(0, ($ground_h - $h));
              break;
          case 1://1为顶端居左
              $posX = 0;
              $posY = 0;
              break;
          case 2://2为顶端居中
              $posX = ($ground_w - $w) / 2;
              $posY = 0;
              break;
          case 3://3为顶端居右
              $posX = $ground_w - $w;
              $posY = 0;
              break;
          case 4://4为中部居左
              $posX = 0;
              $posY = ($ground_h - $h) / 2;
              break;
          case 5://5为中部居中
              $posX = ($ground_w - $w) / 2;
              $posY = ($ground_h - $h) / 2;
              break;
          case 6://6为中部居右
              $posX = $ground_w - $w;
              $posY = ($ground_h - $h) / 2;
              break;
          case 7://7为底端居左
              $posX = 0;
              $posY = $ground_h - $h;
              break;
          case 8://8为底端居中
              $posX = ($ground_w - $w) / 2;
              $posY = $ground_h - $h;
              break;
          case 9://9为底端居右
              $posX = $ground_w - $w - 10;   // -10 是距离右侧10px 可以自己调节
              $posY = $ground_h - $h - 10;   // -10 是距离底部10px 可以自己调节
              break;
          default://随机
              $posX = rand(0, ($ground_w - $w));
              $posY = rand(0, ($ground_h - $h));
              break;
      }

      //设定图像的混色模式
      imagealphablending($ground_im, true);
      if ($isWaterImage) {//图片水印
          imagecopy($ground_im, $water_im, $posX, $posY, 0, 0, $water_w, $water_h); //拷贝水印到目标文件
      } else {//文字水印
          if (!emptyempty($textColor) && (strlen($textColor) == 7)) {
              $R = hexdec(substr($textColor, 1, 2));
              $G = hexdec(substr($textColor, 3, 2));
              $B = hexdec(substr($textColor, 5));
          } else {
              die("水印文字颜色格式不正确!");
          }
          imagestring($ground_im, $textFont, $posX, $posY, $waterText, imagecolorallocate($ground_im, $R, $G, $B));
      }

      //生成水印后的图片
      @unlink($groundImage);
      switch ($ground_info[2]) {//取得背景图片的格式
          case 1:imagegif($ground_im, $groundImage);
              break;
          case 2:imagejpeg($ground_im, $groundImage);
              break;
          case 3:imagepng($ground_im, $groundImage);
              break;
          default:die($errorMsg);
      }

      //释放内存
      if (isset($water_info))
          unset($water_info);
      if (isset($water_im))
          imagedestroy($water_im);
      unset($ground_info);
      imagedestroy($ground_im);
    }
}

参数说明

参数描述默认值
$groundImage背景图片,即需要加水印的图片,暂只支持GIF,JPG,PNG格式-
$waterPos水印位置,有10种状态,0为随机位置 1为顶端居左,2为顶端居中,3为顶端居右; 4为中部居左,5为中部居中,6为中部居右; 7为底端居左,8为底端居中,9为底端居右-
$waterImage图片水印,即作为水印的图片,暂只支持GIF,JPG,PNG格式-
$waterText文字水印,即把文字作为为水印,支持ASCII码,不支持中文-
$textFont文字大小,值为1、2、3、4或5,默认为5-
$textColor文字颜色,值为十六进制颜色值,默认为#FF0000(红色)-

控制器使用

use App\Handlers\WaterMark;

$we = new WaterMark();
return $we->imageWaterMark(public_path('/uploads/book/cover/20210426152407597.jpeg'), 9, public_path('/uploads/common/watermark.png'));

/uploads/common/watermark.png 水印图片


编辑器

如markdown编辑器chenhua/laravel5-markdown-editor使用此方法添加水印:
打开\vendor\chenhua\laravel5-markdown-editor\src\MarkdownEditor.php在顶部引入WaterMark.php

<?php

namespace Chenhua\MarkdownEditor;

use Chenhua\MarkdownEditor\Lib\Parsedown;
use Illuminate\Support\Facades\Request;
use OSS\OssClient;
use Qiniu\Storage\UploadManager;
use Qiniu\Auth;
use App\Handlers\WaterMark;// 添加水印

//本地保存
$pic->move($path, $newName);

下增加

$newpic = new WaterMark();
$newpic->imageWaterMark(public_path($path.'/'.$newName), 9, public_path('/uploads/common/watermark.png'));
本文由 冬眠 原创 ,未经授权 请勿转载
评论
登录后才能发表评论