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 相关文章推荐
PHP+javascript模拟Matrix画面
Oct 09 PHP
小偷PHP+Html+缓存
Dec 20 PHP
关于file_get_contents返回为空或函数不可用的解决方案
Jun 24 PHP
php ios推送(代码)
Jul 01 PHP
PHP CURL CURLOPT参数说明(curl_setopt)
Sep 30 PHP
php获取远程文件的内容和大小
Nov 03 PHP
yii2 页面底部加载css和js的技巧
Apr 21 PHP
CI框架AR数据库操作常用函数总结
Nov 21 PHP
Yii框架学习笔记之session与cookie简单操作示例
Apr 30 PHP
php用户名的密码加密更安全的方法
Jun 21 PHP
PHP 对象继承原理与简单用法示例
Apr 21 PHP
ThinkPHP5分页paginate代码实例解析
Nov 10 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
php下获取Discuz论坛登录用户名、用户组、用户ID等信息的实现代码
2010/12/29 PHP
Laravel框架控制器的middleware中间件用法分析
2019/09/30 PHP
JavaScript中的Window窗口对象
2008/01/16 Javascript
Jquery Ajax请求代码(2)
2011/01/07 Javascript
基于jQuery的投票系统显示结果插件
2011/08/12 Javascript
javascript 闭包
2011/09/15 Javascript
uploadify在Firefox下丢失session问题的解决方法
2013/08/07 Javascript
一个js控制的导航菜单实例代码
2013/12/03 Javascript
JavaScript获取元素尺寸和大小操作总结
2015/02/27 Javascript
跟我学习javascript的闭包
2015/11/16 Javascript
Jquery左右滑动插件之实现超级炫酷动画效果附源码下载
2015/12/02 Javascript
浅谈bootstrap源码分析之tab(选项卡)
2016/06/06 Javascript
JS实现刷新父页面不弹出提示框的方法
2016/06/22 Javascript
JS如何设置iOS中微信浏览器的title
2016/11/22 Javascript
JavaScript实现QQ列表展开收缩扩展功能
2017/10/30 Javascript
nodeJS服务器的创建和重新启动的实现方法
2018/05/12 NodeJs
JavaScript作用域、闭包、对象与原型链概念及用法实例总结
2018/08/20 Javascript
JavaScript实用代码小技巧
2018/08/23 Javascript
Vue列表循环从指定下标开始的多种解决方案
2020/04/08 Javascript
[03:48]显微镜下的DOTA2第四期——TP动作
2014/06/20 DOTA
python定时器使用示例分享
2014/02/16 Python
Python中用于计算对数的log()方法
2015/05/15 Python
python3解析库BeautifulSoup4的安装配置与基本用法
2018/06/26 Python
Django2 连接MySQL及model测试实例分析
2019/12/10 Python
python如何基于redis实现ip代理池
2020/01/17 Python
Python 中的pygame安装与配置教程详解
2020/02/10 Python
解决Python3.8用pip安装turtle-0.0.2出现错误问题
2020/02/11 Python
在pycharm中为项目导入anacodna环境的操作方法
2020/02/12 Python
HTML5 创建canvas元素示例代码
2014/06/04 HTML / CSS
泰国王权免税店官方网站:KingPower
2019/03/11 全球购物
意大利值得信赖的在线超级药房:PillolaStore
2020/02/05 全球购物
CAT鞋加拿大官网:CAT Footwear加拿大
2020/08/05 全球购物
Linux如何修改文件和文件夹的权限
2012/06/27 面试题
心理学专业大学生职业生涯规划范文
2014/02/19 职场文书
学校募捐倡议书
2014/05/14 职场文书
初三语文教学计划
2015/01/22 职场文书