PHP添加PNG图片背景透明水印操作类定义与用法示例


Posted in PHP onMarch 12, 2019

本文实例讲述了PHP添加PNG图片背景透明水印操作类定义与用法。分享给大家供大家参考,具体如下:

图片相关操作类

class ImageTool
{
  private $imagePath;//图片路径
  private $outputDir;//输出文件夹
  public $memoryImg;//内存图像
  public $path;
  public function __construct($imagePath, $outputDir = null)
  {
    $this->imagePath = $imagePath;
    $this->outputDir = $outputDir;
    $this->memoryImg = null;
    $this->path = null;
  }
  /**
   * 显示内存中的图片
   * @param $image
   */
  public function showImage()
  {
    if ($this->memoryImg != null) {
      $info = getimagesize($this->imagePath);
      $type = image_type_to_extension($info[2], false);
      header('Content-type:' . $info['mime']);
      $funs = "image{$type}";
      $funs($this->memoryImg);
      imagedestroy($this->memoryImg);
      $this->memoryImg = null;
    }
  }
  /**
   * 保存图片
   * @param $image  图片路径
   * @return string
   */
  private function saveImage($image)
  {
    $info = getimagesize($this->imagePath);
    $type = image_type_to_extension($info[2], false);
    $funs = "image{$type}";
    if (empty($this->outputDir)) {
      $funs($image, md5($this->imagePath) . '.' . $type);
      return md5($this->imagePath) . '.' . $type;
    } else {
      $funs($image, $this->outputDir . md5($this->imagePath) . '.' . $type);
      return $this->outputDir . md5($this->imagePath) . '.' . $type;
    }
  }
  /**
   * 压缩图片
   * @param $width 压缩后宽度
   * @param $height 压缩后高度
   * @param bool $output 是否输出文件
   * @return resource
   */
  public function compressImage($width, $height, $output = false)
  {
    $image = null;
    $info = getimagesize($this->imagePath);
    $type = image_type_to_extension($info[2], false);
    $fun = "imagecreatefrom{$type}";
    $image = $fun($this->imagePath);
    imagesavealpha($image,true);//
    $thumbnail = imagecreatetruecolor($width, $height);
    imagealphablending($thumbnail,false);//这里很重要,意思是不合并颜色,直接用$img图像颜色替换,包括透明色;
    imagesavealpha($thumbnail,true);//
    imagecopyresampled($thumbnail, $image, 0, 0, 0, 0, $width, $height, $info[0], $info[1]);
    imagedestroy($image);
    if ($output) {
      $path = $this->saveImage($thumbnail);
      $this->path = $path;
    }
    $this->memoryImg = $thumbnail;
    return $this;
  }
  /**
   * 为图像添加文字标记
   *
   * @param $content 文本内容
   * @param $size 字体大小
   * @param $font 字体样式
   * @param bool $output 是否输出文件
   * @return $this
   */
  public function addTextmark($content, $size, $font, $output = false)
  {
    $info = getimagesize($this->imagePath);
    $type = image_type_to_extension($info[2], false);
    $fun = "imagecreatefrom{$type}";
    $image = $fun($this->imagePath);
    $color = imagecolorallocatealpha($image, 0, 0, 0, 80);
    $posX = imagesx($image) - strlen($content) * $size / 2;
    $posY = imagesy($image) - $size / 1.5;
    imagettftext($image, $size, 0, $posX, $posY, $color, $font, $content);
    if ($output) {
      $this->saveImage($image);
    }
    $this->memoryImg = $image;
    return $this;
  }
  /**
   * 为图片添加水印
   *
   * @param $watermark 水印图片路径
   * @param $alpha 水印透明度(0-100)
   * @param bool $output 是否输出文件
   * @return $this
   */
  public function addWatermark($watermark, $alpha, $output = false)
  {
    $image_info = getimagesize($this->imagePath);
    $image_type = image_type_to_extension($image_info[2], false);
    $image_fun = "imagecreatefrom{$image_type}";
    $image = $image_fun($this->imagePath);
    $mark_info = getimagesize($watermark);
    $mark_type = image_type_to_extension($mark_info[2], false);
    $mark_fun = "imagecreatefrom{$mark_type}";
    $mark = $mark_fun($watermark);
    $posX = imagesx($image) - imagesx($mark);
    $posY = imagesy($image) - imagesy($mark);
    imagesavealpha($mark, true);
    imagecopymerge($image, $mark, $posX, $posY, 0, 0, $mark_info[0], $mark_info[1], $alpha);
    imagesavealpha($mark, true);
    if ($output) {
      $path = $this->saveImage($image);
      $this->path = $path;
    }
    $this->memoryImg = $image;
    return $this;
  }
  //用给定角度旋转图像,以jpeg图像格式为例
  /**
   * 水印图片旋转
   * @param $degrees     旋转角度
   * @param bool $output   是否保存图片
   * @return $this
   */
  function rotateImage($degrees, $output = false)
  {
    $info = getimagesize($this->imagePath);
    $type = image_type_to_extension($info[2], false);
    $fun = "imagecreatefrom{$type}";
    $image = $fun($this->imagePath);
    $block = imagecreatetruecolor(170,170);//建立一个画板
    $bg = imagecolorallocatealpha($block , 0 , 0 , 0 , 127);//拾取一个完全透明的颜色
    $image = imagerotate($image, $degrees, $bg ,0);
    imagesavealpha($image, true);
    header("Content-type: image/{$type}");
    //旋转后的图片保存
    if ($output) {
      $path = $this->saveImage($image);
      $this->path = $path;
    }
    $this->memoryImg = $image;
    return $this;
  }
  /**
  * 添加PNG透明图片
  * $bigImgPath 目标图片路径
  * $smallImgPath 水印图片路径
  * $width 相对于目标图的x轴放置位置 左上角为 0
  * $height 相对于目标图的y轴放置位置 左上角为0
  * $bigImgPaths 合成后的图片路径 若路径名与第一张或第二张路径相同 直接覆盖原图
  */
  public function mergerImg($bigImgPath, $smallImgPath, $width, $height, $bigImgPaths)
  {
    $image_kuang = imagecreatefromstring(file_get_contents($smallImgPath));
    $image_photo = imagecreatefromstring(file_get_contents($bigImgPath));
    //创建一个新的,和大图一样大的画布
    $image_3 = imageCreatetruecolor(imagesx($image_photo), imagesy($image_photo));
    //为真彩色画布创建白色背景,再设置为透明
    $color = imagecolorallocate($image_3, 255, 255, 255);
    imagefill($image_3, 0, 0, $color);
    imageColorTransparent($image_3, $color);
    /**
     * 先copy图片,再copy画框,实现png的透明效果,将图片嵌入到画框里
     * imagecopymerge与imagecopy的不同:
     * imagecopymerge 函数可以支持两个图像叠加时,设置叠加层的透明度。imagecopymerge比imagecopy多一个参数,来设置透明度
     * PHP内部源码里,imagecopymerge在透明度参数为100时,直接调用imagecopy函数。
     * imagecopy 函数则不支持叠加透明,但拷贝时可以保留png图像的原透明信息,而imagecopymerge却不支持图片的本身的透明拷贝
     * 即:使用imagecopymerge函数,可以实现打上透明度为30%的淡淡的水印图标,但图片本身的png就会变得像IE6不支持png透明那样,背景不透明了。
     * 如果使用imagecopy函数,可以保留图片本身的透明信息,但无法实现30%的淡淡水印叠加,
     */
   imagecopyresampled($image_3,$image_photo,0,0,0,0,imagesx($image_photo),imagesy($image_photo),imagesx($image_photo),imagesy($image_photo));
    imagecopy($image_3,$image_kuang, $width,$height,0,0,imagesx($image_kuang),imagesy($image_kuang));
    //存储图片路径
    imagejpeg($image_3, $bigImgPaths);
    return $bigImgPaths;
  }
}

控制器调用方法

public function test()
{
  $bigImgPath = 'ren.jpg';//原图路径
  $waterImgPath = 'tae.png';//水印图路径
  $imageTool = new ImageTool($waterImgPath, 'tmp/');//图片路径、输出文件夹
  $smallImgPath = $imageTool->rotateImage(45, true)->path;//旋转
  $width = 0;//水印所在X坐标
  $height = 0;//水印所在Y坐标
  $bigImgPaths = 'new.png';//生成原图加水印新图路径
  $path = $this->mergerImg($bigImgPath, $smallImgPath, $width, $height, $bigImgPaths);
  return view('image', compact('path'));
}

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
php4的session功能评述(三)
Oct 09 PHP
Linux下ZendOptimizer的安装与配置方法
Apr 12 PHP
如何用phpmyadmin设置mysql数据库用户的权限
Jan 09 PHP
PHP 第一节 php简介
Apr 28 PHP
基于PHP静态类的原罪详解
May 06 PHP
页面乱码问题的根源及其分析
Aug 09 PHP
简单谈谈favicon
Jun 10 PHP
Yii2 输出xml格式数据的方法
May 03 PHP
php版微信自动登录并获取昵称的方法
Sep 23 PHP
php str_replace替换指定次数的方法详解
May 05 PHP
Laravel实现表单提交
May 07 PHP
goto语法在PHP中的使用教程
Sep 17 PHP
PHP DB 数据库连接类定义与用法示例
Mar 11 #PHP
PHP实现的杨辉三角求解算法分析
Mar 11 #PHP
PHP实现的只保留字符串首尾字符功能示例【隐藏部分字符串】
Mar 11 #PHP
ThinkPHP5.0框架验证码功能实现方法【基于第三方扩展包】
Mar 11 #PHP
PHP join()函数用法与实例讲解
Mar 11 #PHP
PHP lcfirst()函数定义与用法
Mar 08 #PHP
浅谈PHPANALYSIS提取关键字
Mar 08 #PHP
You might like
把77A收信机改造成收音机
2021/03/02 无线电
PHP常用代码
2006/11/23 PHP
关于在php.ini中添加extension=php_mysqli.dll指令的说明
2007/06/14 PHP
检测codeigniter脚本消耗内存情况的方法
2015/03/21 PHP
php操作memcache缓存方法分享
2015/06/03 PHP
浅谈PHP检查数组中是否存在某个值 in_array 函数
2016/06/13 PHP
老生常谈文本文件和二进制文件的区别
2017/02/27 PHP
PHP使用HTML5 FormData对象提交表单操作示例
2019/07/02 PHP
phpstorm激活码2020附使用详细教程
2020/09/25 PHP
Jquery知识点三 jquery表单对象操作
2011/01/17 Javascript
推荐11款jQuery开发的复选框和单选框美化插件
2011/08/02 Javascript
IE下使用jQuery重置iframe地址时内存泄露问题解决办法
2015/02/05 Javascript
.NET微信公众号开发之创建自定义菜单
2015/07/16 Javascript
jQuery控制div实现随滚动条滚动效果
2016/06/07 Javascript
Javascript单例模式的介绍和实例
2016/10/08 Javascript
JS正则子匹配实例分析
2016/12/22 Javascript
微信小程序 利用css实现遮罩效果实例详解
2017/01/21 Javascript
nodejs入门教程二:创建一个简单应用示例
2017/04/24 NodeJs
Vue项目添加动态浏览器头部title的方法
2018/07/11 Javascript
Node.js 如何利用异步提升任务处理速度
2019/01/07 Javascript
解决微信小程序云开发中获取数据库的内容为空的方法
2019/05/15 Javascript
微信小程序登陆注册功能的实现代码
2019/12/10 Javascript
Python函数式编程指南(三):迭代器详解
2015/06/24 Python
Python的pycurl包用法简介
2015/11/13 Python
Python基于回溯法子集树模板解决数字组合问题实例
2017/09/02 Python
python3处理含有中文的url方法
2018/05/10 Python
python三大神器之fabric使用教程
2019/06/10 Python
对PyQt5中树结构的实现方法详解
2019/06/17 Python
Python 处理文件的几种方式
2019/08/23 Python
Python for循环及基础用法详解
2019/11/08 Python
CSS3中的@keyframes关键帧动画的选择器绑定
2016/06/13 HTML / CSS
德国网上花店:Valentins
2018/08/15 全球购物
西班牙最大的在线滑板和街头服饰商店:Fillow.net
2019/04/15 全球购物
介绍一下如何利用路径遍历进行攻击及如何防范
2014/01/19 面试题
实习生的自我鉴定范文欣赏
2013/11/20 职场文书
教你怎么用python selenium实现自动化测试
2021/05/27 Python