<?php
$image = new Image();
$image->water('./upload/up_5cf0caca0565b.png','./upload/up_5cf0cb3a61fae.jpg',9);
class Image
{
//路径
protected $path;
//是否启用随机名字
protected $isRandName;
//要保存的图像类型
protected $type; //通过构造方法对成员属性进行初始化
function __construct($path = './', $isRandName = true, $type = 'png')
{
$this->path = $path;
$this->isRandName = $isRandName;
$this->type = $type;
} /**
* 对外公开的水印方法
*
* @param [type] $image 原图片
* @param [type] $water 水印图片
* @param [type] $postion 水印图片的位置
* @param integer $tmd 水印图片的透明度
* @param string $prefix 图片的前缀
* @return void
*/
function water($image, $water, $postion, $tmd = 100, $prefix = 'water_')
{
//1、判断这两个图片是否存在
if ((!file_exists($image)) || (!file_exists($water))) {
die('图片资源不存在');
}
//2、得到原图片的宽度和高度以及水印图片的宽带和高度
$imageInfo = self::getImageInfo($image);
$waterInfo = self::getImageInfo($water);
//3、判断水印图片能否贴上来
if (!$this->checkImage($imageInfo, $waterInfo)) {
exit('水印图片太大');
}
//4、打开图片
$imageRes = self::openAnyImage($image);
$waterRes = self::openAnyImage($water);
//5、根据水印图片的位置计算水印图片的坐标
$pos = $this->getPostion($postion, $imageInfo, $waterInfo);
//6、将水印图片贴过来
imagecopymerge($imageRes, $waterRes, $pos['x'], $pos['y'], 0, 0, $waterInfo['width'], $waterInfo['height'], $tmd);
//7、得到要保存图片的文件名
$newName = $this->createNewName($image, $prefix);
//8、得到保存图片的路径,也就是文件的全路径
$newPath = rtrim($this->path, '/') . '/' . $newName;
//9、保存图片
$this->saveImage($imageRes, $newPath);
//10、销毁资源
imagedestroy($imageRes);
imagedestroy($waterRes);
return $newPath;
} /**
* 保存图像资源函数
*
* @param [type] $imageRes
* @param [type] $newPath
* @return void
*/
protected function saveImage($imageRes, $newPath)
{
//imagepng imagegif imagewbmp
$func = 'image' . $this->type;
//通过变量函数进行保存
$func($imageRes, $newPath);
} /**
* 得到文件名函数
*
* @param [type] $imagePath
* @param [type] $prefix
* @return void
*/
protected function createNewName($imagePath, $prefix)
{
if ($this->isRandName) {
$name = $prefix . uniqid() . '.' . $this->type;
} else {
$name = $prefix . pathinfo($imagePath)['filename'] . '.' . $this->type;
}
return $name;
} /**
* 根据位置计算水印图片的坐标
*
* @param [type] $postion
* @param [type] $imageInfo
* @param [type] $waterInfo
* @return void
*/
protected function getPostion($postion, $imageInfo, $waterInfo)
{
switch ($postion) {
case 1:
$x = 0;
$y = 0;
break;
case 2:
$x = ($imageInfo['width'] - $waterInfo['width']) / 2;
$y = 0;
break;
case 3:
$x = $imageInfo['width'] - $waterInfo['width'];
$y = 0;
break;
case 4:
$x = 0;
$y = ($imageInfo['height'] - $waterInfo['height']) / 2;;
break;
case 5:
$x = ($imageInfo['width'] - $waterInfo['width']) / 2;
$y = ($imageInfo['height'] - $waterInfo['height']) / 2;
break;
case 6:
$x = $imageInfo['width'] - $waterInfo['width'];
$y = ($imageInfo['height'] - $waterInfo['height']) / 2;
break;
case 7:
$x = 0;
$y = $imageInfo['height'] - $waterInfo['height'];
break;
case 8:
$x = ($imageInfo['width'] - $waterInfo['width']) / 2;
$y = $imageInfo['height'] - $waterInfo['height'];
break;
case 9:
$x = $imageInfo['width'] - $waterInfo['width'];
$y = $imageInfo['height'] - $waterInfo['height'];
break;
case 0:
$x = mt_rand(0, ($imageInfo['width'] - $waterInfo['width']));
$y = mt_rand(0, ($imageInfo['height'] - $waterInfo['height']));
break;
}
return ['x' => $x, 'y' => $y];
} /**
* 判断水印图片是否大于原图片
*
* @param [type] $imageInfo
* @param [type] $waterInfo
* @return void
*/
protected function checkImage($imageInfo, $waterInfo)
{
if (($waterInfo['width'] > $imageInfo['width']) || ($waterInfo['height'] > $imageInfo['height'])) {
return false;
}
return true;
} /**
* 静态方法,根据图片的路径得到图片信息,宽度、高度、mime类型
*
* @param [type] $imagePath
* @return void
*/
static function getImageInfo($imagePath)
{
//得到图片信息
$info = getimagesize($imagePath);
//保存图片宽度
$data['width'] = $info[0];
//保存图片高度
$data['height'] = $info[1];
//保存图片mime类型
$data['mime'] = $info['mime'];
//将图片信息返回
return $data;
} /**
* 根据图片类型打开任意图片
*
* @param [type] $imagePath
* @return void
*/
static function openAnyImage($imagePath)
{
//得到图片的mime类型
$mime = self::getImageInfo($imagePath)['mime'];
//根据不同的mime类型来使用不同的函数进行打开图片
switch ($mime) {
case 'image/png':
$image = imagecreatefrompng($imagePath);
break;
case 'image/gif':
$image = imagecreatefromgif($imagePath);
break;
case 'image/jpeg':
$image = imagecreatefromjpeg($imagePath);
break;
case 'image/wbmp':
$image = imagecreatefromwbmp($imagePath);
break;
}
return $image;
}
}

PHP学习之图像处理-水印类的更多相关文章

  1. c++ MFC图像处理CImage类常用操作代码

    原文作者:aircraft 原文地址:https://www.cnblogs.com/DOMLX/p/9598974.html MFC图像处理CImage类常用操作 CImage类头文件为#inclu ...

  2. Java学习-041-颜色工具类(RGB,HEX)

    在日常的网页开发中,经常需要进行颜色数值获取.转换,例如获取红色,获取蓝色,获取绿色,RGB转十六进制颜色,十六进制颜色转RGB等,因而在学习过程中,写了一个小工具类,仅供各位小主参考! 多不闲言,直 ...

  3. pdo文字水印类,验证码类,缩略图类,logo类

    文字水印类 image.class.php <?php /** * webrx.cn qq:7031633 * @author webrx * @copyright copyright (c) ...

  4. PHP水印类

    <?php /** * 水印类 * @author zhaoyingnan 2015/07/16 **/ include_once('extend.php'); class Watermark_ ...

  5. PHP 图片水印类

    <?php /** * 加水印类,支持文字图片水印的透明度设置.水印图片背景透明. * $obj = new WaterMask($imgFileName); //实例化对象 * $obj-&g ...

  6. 图像处理JPEGCodec类错误问题 毕业设计遇到的问题

     图像处理JPEGCodec类已经从Jdk1.7移除 2014-06-16 20:01:26 分类: 架构设计与优化 著名测试工具jira在使用图像处理JPEGCodec类会报告以下信息: 我是这样用 ...

  7. UML学习(二)-----类图

    UML学习(二)-----类图 http://www.cnblogs.com/silent2012/archive/2011/09/07/2169946.html http://www.cnblogs ...

  8. (转)Qt Model/View 学习笔记 (七)——Delegate类

    Qt Model/View 学习笔记 (七) Delegate  类 概念 与MVC模式不同,model/view结构没有用于与用户交互的完全独立的组件.一般来讲, view负责把数据展示 给用户,也 ...

  9. (转)Qt Model/View 学习笔记 (五)——View 类

    Qt Model/View 学习笔记 (五) View 类 概念 在model/view架构中,view从model中获得数据项然后显示给用户.数据显示的方式不必与model提供的表示方式相同,可以与 ...

随机推荐

  1. Oracle 数据 查询 一对多 取最新一条非 0 数据

    主键id     待查字段     日期 1            6             2019/5/1 1            0             2019/5/2 需求: 找出 ...

  2. c#通用语言运行时CLR

  3. Djang drf:APIView源码分析

    Django REST framework 简介   在序列化与反序列化时,虽然操作的数据不尽相同,但是执行的过程却是相似的,也就是说这部分代码是可以复用简化编写的.        开发REST AP ...

  4. synchronized 和 ReentrantLock 区别是什么?(未完成)

    synchronized 和 ReentrantLock 区别是什么?(未完成)

  5. cas的客户端配置

    知识点:cas的客户端配置 一:cas客户端配置 二:cas认证流程原理(图) 参考:https://www.cnblogs.com/suiyueqiannian/p/9359597.html 源码: ...

  6. BCB 中 Application->CreateForm 和 New 的一个区别

    Application->Create 和 NEW 的一个区别 最近写windows服务的时候,恰巧碰到一个问题.我建立了一个DataModal,然后在Datamodal的OnCreate 事件 ...

  7. Selenium(二)开发环境的搭建

    1.安装python的开发集成环境 我之前有写,可参考https://www.cnblogs.com/dydxw/p/10405797.html 2.使用selenium打开火狐浏览器 先从selen ...

  8. JVM之Java运行时数据区(线程隔离区)

    来源 JVM会在会在执行Java程序过程中把所管理的内存划分为若干区域,主要包括程序计数器(Program Counter Register),虚拟机栈(VM Stack),本地方法栈(Native ...

  9. idea 设置 maven 默认位置

    在 idea 中创建 maven 项目 每次都要修改掉 默认的maven位置,觉得很烦.... 所以这边篇博客就是专门解决掉这个麻烦精的......(233333) 首先   File --> ...

  10. selenium怎样避免被服务器检测

    selenium是用来完成浏览器自动化相关的操作.可以通过代码的形式制定一些基于浏览器自动化的相关操作(行为动作),当代码执行后,浏览器就会自动触发相关的事件.但这并不能避免服务器的检测.当在浏览器中 ...