<?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数据库默认的data pump dir在哪

    转自:https://zhidao.baidu.com/question/921271686131558779.html 使用select * from dba_directories;可以查到,例如 ...

  2. Nginx从安装到简单使用

    一.什么是Nginx: Nginx是一个高性能的HTTP和反向代理服务,也是一个IMAP/POP3/SMTP服务. 二.Nginx作用: 反向代理,集群,虚拟服务器,负载均衡,动静分离,解决跨域问题等 ...

  3. Postman --> YApi

    初始 Postman,才知其如此强大,慢慢接触学习吧~ “Modern software is built on APIs,Postman helps you develop APIs faster” ...

  4. 【2018-01-26】SqlServer 检查死锁和阻塞

    利用sys.sysprocesses SQL进程检查是否出现死锁和阻塞 Sys.SysProcesses 系统表是一个很重要的系统视图,主要用来定位与解决Sql Server的阻塞和死锁 select ...

  5. zabbix low-level discovery 监控mysql

    当一台服务器上MySQL有多个实例的时候,MySQL占用多个不同端口.利用zabbix的low-level discovery可以轻松监控. 思路参考:http://dl528888.blog.51c ...

  6. idou老师教你学Istio 23 : 如何用 Istio 实现速率限制

    使用 Istio 可以很方便地实现速率限制.本文介绍了速率限制的使用场景,使用 memquota\redisquota adapter 实现速率限制的方法,通过配置 rule 实现有条件的速率限制,以 ...

  7. css中 禁止spa有点击状态

    <span class="an" onclick="selNum();"></span> var selNum = function() ...

  8. 算法设计与分析 - 李春葆 - 第二版 - pdf->word v3

    1.1 第1章─概论 练习题 . 下列关于算法的说法中正确的有( ). Ⅰ.求解某一类问题的算法是唯一的 Ⅱ.算法必须在有限步操作之后停止 Ⅲ.算法的每一步操作必须是明确的,不能有歧义或含义模糊 Ⅳ. ...

  9. [唐胡璐]Selenium技巧- dataProvider实现数据驱动

    废话不多讲,直接进主题,怎么实现用Excel配置测试数据,用dataProvider来调用测试数据。 jxl目前来看只支持.xls格式的文件,所以我们采用Apache POI来实现对.xlsx的操作, ...

  10. 性能一 Exploring Mobile vs. Desktop OpenGL Performance

    opengl insight Exploring Mobile vs. DesktopOpenGL Performance Jon McCaffrey 前面那些内容以前看过 应该写在谋篇帖子里了  F ...