PHP add text watermark or picture watermark watermark class complete source code and use examples

  • 2021-12-04 09:44:31
  • OfStack

PHP to add a picture watermark function, can add text watermark or picture watermark, use text watermark need to provide font file, use picture watermark need to provide watermark picture, watermark picture can not be larger than the picture to add watermark, please use background transparent watermark picture.

The watermark class supports customization of watermark location, watermark size and watermark transparency, font watermark can customize color and so on, and its functions have been improved accordingly.

The complete source code is as follows (examples of use are given in the comments):


<?php
/**
 *  Picture watermarking class, support text watermarking, transparency setting, custom watermark position, etc. 
 *  Use example: 
 *   $obj = new WaterMask($imgFileName);  // Instantiate object 
 *   $obj->$waterType = 1;   // Type: 0 For text watermarking, 1 Watermark a picture 
 *   $obj->$transparent = 45;   // Watermark transparency 
 *   $obj->$waterStr = 'www.ofstack.com';  // Watermark text 
 *   $obj->$fontSize = 18;   // Text font size 
 *   $obj->$fontColor = array(255,255,255);  // Watermark text color ( RGB ) 
 *   $obj->$fontFile = 'AHGBold.ttf';  // Font file 
 *  ... 
 *   $obj->output();    // The output watermark image file overwrites the input image file 
 */
class WaterMask{
  public $waterType     = 0;   // Watermark type: 0 For text watermarking, 1 Watermark a picture 
  public $pos        = 0;   // Watermark location 
  public $transparent    = 45;   // Watermark transparency 
  public $waterStr      = 'www.ofstack.com';  // Watermark text 
  public $fontSize      = 18;   // Text font size 
  public $fontColor     = array(255,255,255);  // Watermark text color ( RGB ) 
  public $fontFile      = 'AHGBold.ttf';  // Font file 
  public $waterImg      = 'logo.png';  // Watermark image 
  private $srcImg       = '';   // Pictures that need to be watermarked 
  private $im         = '';   // Picture handle 
  private $water_im      = '';   // Watermark image handle 
  private $srcImg_info    = '';   // Picture information 
  private $waterImg_info   = '';   // Watermark picture information 
  private $str_w       = '';   // Watermark text width 
  private $str_h       = '';   // Watermark text height 
  private $x         = '';   // Watermark X Coordinates 
  private $y         = '';   // Watermark y Coordinates 
  function __construct($img) {    // Destructor 
    $this->srcImg = file_exists($img) ? $img : die('"'.$img.'"  Source file does not exist! ');
  }
  private function imginfo() { // Get the information of the picture that needs to be watermarked, and load the picture. 
    $this->srcImg_info = getimagesize($this->srcImg);
    switch ($this->srcImg_info[2]) {
      case 3:
        $this->im = imagecreatefrompng($this->srcImg);
        break 1;
      case 2:
        $this->im = imagecreatefromjpeg($this->srcImg);
        break 1;
      case 1:
        $this->im = imagecreatefromgif($this->srcImg);
        break 1;
      default:
        die(' Original picture ( '.$this->srcImg.' ) Format is incorrect, only supports PNG , JPEG , GIF . ');
    }
  }
  private function waterimginfo() { // Get the information of the watermark picture and load the picture. 
    $this->waterImg_info = getimagesize($this->waterImg);
    switch ($this->waterImg_info[2]) {
      case 3:
        $this->water_im = imagecreatefrompng($this->waterImg);
        break 1;
      case 2:
        $this->water_im = imagecreatefromjpeg($this->waterImg);
        break 1;
      case 1:
        $this->water_im = imagecreatefromgif($this->waterImg);
        break 1;
      default:
        die(' Watermark image ( '.$this->srcImg.' ) Format is incorrect, only supports PNG , JPEG , GIF . ');
    }
  }
  private function waterpos() { // Watermark location algorithm 
    switch ($this->pos) {
      case 0:   // Random position 
        $this->x = rand(0,$this->srcImg_info[0]-$this->waterImg_info[0]);
        $this->y = rand(0,$this->srcImg_info[1]-$this->waterImg_info[1]);
        break 1;
      case 1:   // Upper left 
        $this->x = 0;
        $this->y = 0;
        break 1;
      case 2:   // Upper middle 
        $this->x = ($this->srcImg_info[0]-$this->waterImg_info[0])/2;
        $this->y = 0;
        break 1;
      case 3:   // Upper right 
        $this->x = $this->srcImg_info[0]-$this->waterImg_info[0];
        $this->y = 0;
        break 1;
      case 4:   // Center-left 
        $this->x = 0;
        $this->y = ($this->srcImg_info[1]-$this->waterImg_info[1])/2;
        break 1;
      case 5:   // Middle-middle 
        $this->x = ($this->srcImg_info[0]-$this->waterImg_info[0])/2;
        $this->y = ($this->srcImg_info[1]-$this->waterImg_info[1])/2;
        break 1;
      case 6:   // Middle right 
        $this->x = $this->srcImg_info[0]-$this->waterImg_info[0];
        $this->y = ($this->srcImg_info[1]-$this->waterImg_info[1])/2;
        break 1;
      case 7:   // Lower left 
        $this->x = 0;
        $this->y = $this->srcImg_info[1]-$this->waterImg_info[1];
        break 1;
      case 8:   // Lower middle 
        $this->x = ($this->srcImg_info[0]-$this->waterImg_info[0])/2;
        $this->y = $this->srcImg_info[1]-$this->waterImg_info[1];
        break 1;
      default:  // Lower right 
        $this->x = $this->srcImg_info[0]-$this->waterImg_info[0];
        $this->y = $this->srcImg_info[1]-$this->waterImg_info[1];
        break 1;
    }
  }
  private function waterimg() {
    if ($this->srcImg_info[0] <= $this->waterImg_info[0] || $this->srcImg_info[1] <= $this->waterImg_info[1]){
      die(' The watermark is bigger than the original image! ');
    }
    $this->waterpos();
    $cut = imagecreatetruecolor($this->waterImg_info[0],$this->waterImg_info[1]);
    imagecopy($cut,$this->im,0,0,$this->x,$this->y,$this->waterImg_info[0],$this->waterImg_info[1]);
    $pct = $this->transparent;
    imagecopy($cut,$this->water_im,0,0,0,0,$this->waterImg_info[0],$this->waterImg_info[1]);
    imagecopymerge($this->im,$cut,$this->x,$this->y,0,0,$this->waterImg_info[0],$this->waterImg_info[1],$pct);
  }
  private function waterstr() {
    $rect = imagettfbbox($this->fontSize,0,$this->fontFile,$this->waterStr);
    $w = abs($rect[2]-$rect[6]);
    $h = abs($rect[3]-$rect[7]);
    $fontHeight = $this->fontSize;
    $this->water_im = imagecreatetruecolor($w, $h);
    imagealphablending($this->water_im,false);
    imagesavealpha($this->water_im,true);
    $white_alpha = imagecolorallocatealpha($this->water_im,255,255,255,127);
    imagefill($this->water_im,0,0,$white_alpha);
    $color = imagecolorallocate($this->water_im,$this->fontColor[0],$this->fontColor[1],$this->fontColor[2]);
    imagettftext($this->water_im,$this->fontSize,0,0,$this->fontSize,$color,$this->fontFile,$this->waterStr);
    $this->waterImg_info = array(0=>$w,1=>$h);
    $this->waterimg();
  }
  function output() {
    $this->imginfo();
    if ($this->waterType == 0) {
      $this->waterstr();
    }else {
      $this->waterimginfo();
      $this->waterimg();
    }
    switch ($this->srcImg_info[2]) {
      case 3:
        imagepng($this->im,$this->srcImg);
        break 1;
      case 2:
        imagejpeg($this->im,$this->srcImg);
        break 1;
      case 1:
        imagegif($this->im,$this->srcImg);
        break 1;
      default:
        die(' Failed to add watermark! ');
        break;
    }
    imagedestroy($this->im);
    imagedestroy($this->water_im);
  }
}
?>

Summarize


Related articles: