PHP给图片添加水印

有些站点也许是出于推广或者防盗的目的在上传图片时给图片加上一个Logo水印,我就见过有些站长直接用图片工具添加水印然后再上传,当然这样也能实现效果。但PHP中也可以完成给图片加水印的功能。就PHP函数功能这里就不再去浪费口舌介绍了,直接说下如何实现。大体有以下步骤

准备好水印图

这个水印图不限格式,gif或png或jpg都可以,大小调成合适的即可。透明度不需要,因为我们可以在PHP中灵活设置透明度。如果不会使用制图工具制作Logo可以去谷歌一下在线Logo制作,随便点击进入一个链接敲几个字即可生成,当然是免费的。

编写代码

这里重点给出以下函数名,也就是实现水印功能主要就是靠这些函数功能操作

  • imagecreatefromjpeg 打开JPG图片
  • imagecreatefromgif 打开GIF图片
  • imagecreatefrompng 打开PNG图片
  • imagecreatefromwbmp 打开WBMP图片(比较少用)
  • getimagesize 获取图片大小信息
  • imagecopymerge 把多张图片整合(添加水印的主要函数)
  • imagejpeg 保存JPG图片
  • imagegif 保存GIF图片
  • imagepng 保存PNG图片

完成以上步骤以后,你就可以给你上传的图片添加水印了。以下是我写的一个例子

Watermark.class.php

<?php
/**
 * 琼台博客 www.qttc.net
 * 加水印类
 */
 
class Watermark {
  private $imgPath; // 图片路径
    
  public function __construct($imgPath="./"){
    $this->imgPath = rtrim($imgPath,"/")."/";
  }

  // 写水印动作
  public function waterInfo($ground,$water,$pos=0,$prefix="lee_",$tm=50){
    $allPathGround  = $this->imgPath.$ground;
    $allPathWater   = $this->imgPath.$water;
    $groundInfo = $this->imgInfo($allPathGround);    
    $waterInfo  = $this->imgInfo($allPathWater);

    //判断水印图片是否比原图大
    if(!$newPos=$this->imgPos($groundInfo,$waterInfo,$pos)){
      echo "您的水印图片比原图大哦";     
      return false;
    }
      
    //打开资源
    $groundRes=$this->imgRes($allPathGround,$groundInfo['mime']);
    $waterRes=$this->imgRes($allPathWater,$waterInfo['mime']);

    //整合资源
    $newGround=$this->imgCopy($groundRes,$waterRes,$newPos,$waterInfo,$tm);

    //保存资源
    $this->saveImg($newGround,$ground,$groundInfo['mime'],$prefix);

  }

  private function saveImg($img,$ground,$info,$prefix){
    $path=$this->imgPath.$prefix.$ground;
    switch($info){
      case "image/jpg":   
      case "image/jpeg":
      case "image/pjpeg":
        imagejpeg($img,$path);
        break;
      case "image/gif":
        imagegif($img,$path);
        break;
      case "image/png":
        imagepng($img,$path);
        break;
      default:
        imagegd2($img,$path);   
    }   
  }

  private function imgCopy($ground,$water,$pos,$waterInfo,$tm){   
    imagecopymerge($ground,$water,$pos[0],$pos[1],0,0,$waterInfo[0],$waterInfo[1],$tm);
    return $ground;
  }

  private function imgRes($img,$imgType){
    switch($imgType){
      case "image/jpg":   
      case "image/jpeg":
      case "image/pjpeg":
        $res=imagecreatefromjpeg($img);
        break;
      case "image/gif":
        $res=imagecreatefromgif($img);
        break;
      case "image/png":
        $res=imagecreatefrompng($img);
        break;
      case "image/wbmp":
        $res=imagecreatefromwbmp($img);
        break;
      default:
        $res=imagecreatefromgd2($img);
    }   
    return $res;
  }

  // 位置为
  // 1 左上 2中上 3右上
  // 4 左中 5中中 6右中
  // 7 左下 8中下 9右下
  // 0 随机位置
  private function imgPos($ground,$water,$pos){
    if($ground[0]<$water[0] || $ground[1]<$water[1])  //判断水印与原图比较 如果水印的高或者宽比原图小 将返回假
      return false;

    switch($pos){
      case 1:
        $x=0;
        $y=0;
        break;
      case 2:
        $x=ceil(($ground[0]-$water[0])/2);
        $y=0;
        break;
      case 3: 
        $x=$ground[0]-$water[0];
        $y=0;
        break;
      case 4:
        $x=0;
        $y=ceil(($ground[1]-$water[1])/2);
        break;
      case 5:
        $x=ceil(($ground[0]-$water[0])/2);
        $y=ceil(($ground[1]-$water[1])/2);
        break;
      case 6:
        $x=$ground[0]-$water[0];
        $y=ceil(($ground[1]-$water[1])/2);
        break;
      case 7:
        $x=0;
        $y=$ground[1]-$water[1];
        break;
      case 8:
        $x=ceil($ground[0]-$water[0]/2);
        $y=$ground[1]-$water[1];
        break;
      case 9:
        $x=$ground[0]-$water[0];
        $y=$ground[1]-$water[1];
        break;
      case 0:
      default:
        $x=rand(0,$ground[0]-$water[0]);
        $y=rand(0,$ground[1]-$water[1]);
    }
    $xy[]=$x;
    $xy[]=$y;
    return $xy; 
  }

  // 获取图片信息的函数
  private function imgInfo($img){
    return getimagesize($img);  
  }
}

这样使用

<?php
// 琼台博客 www.qttc.net

// 包含类文件
include("Watermark.class.php");      
 
// 可以传进一个添加水印后保存的路径,路径相对于类脚本
// 如果为空则默认是脚本当前路径
$watermark=new Watermark();     
 
// 参数:
// 1.  源图  
// 2. 水印图 即 LOGO
// 3.  位置 
// 位置为
// 1 左上 2中上 3右上
// 4 左中 5中中 6右中
// 7 左下 8中下 9右下
// 0 随机位置
 // 4. 保存添加水印图片的文件名前缀  
//  5. 透明度
$watermark->waterInfo("02.jpg", "01.jpg", 9, "Hello QTTC", 20);
分享

TITLE: PHP给图片添加水印

LINK: https://www.qttc.net/88-php-image-watermark.html

NOTE: 原创内容,转载请注明出自琼台博客