<?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. 6.NIO2-Path、Paths、Files

    NIO.2 jdk1.7中,java对 NIO 极大的扩展,主要增强的是对文件处理 和 文件系统特性的支持 关于其中一些API的使用 public class TestNIO_2_Path_File ...

  2. 新版mysql的配置文件my.ini位置

    在网上的博客上找了好久的my.ini,一直找不到.最后发现原来新版本的mysql已经不把my.ini放在原始的安装目录了.而是放在了C:/ProgramData下.

  3. javaWeb文件上传与下载

    文件上传与下载在项目中运用的使用频率很大 今天也花时间整理了一下 多文件上传图片回显 和文件下载  1.多文件上传 这里会涉及到几个属性 fileSizeThreshold:缓冲区文件的大小 如果上传 ...

  4. Maven 发布项目到Jetty服务器———5

    官网: http://www.eclipse.org/jetty/documentation/current/jetty-maven-plugin.html 1.安装配置插件 2. 运行 命令: je ...

  5. C++ ---释放内存(new和delete)

    C++ ---释放内存(new和delete) C++动态分配和释放内存 @c.biancheng.net/view/206.html -------------------------------- ...

  6. ASP.Net用户控件的使用

    一.概述: 与WEB窗体页相同,程序员可以使用任何文本编辑器创作用户控件,或者使用代码隐藏类开发用户控件.此外,与WEB窗体页一样,用户控件可以在第一次请求时被编译并存储在服务器内存中,从而缩短以后请 ...

  7. Mongo Backup

    #!/bin/sh # This script is run on every mongo node. However, it checks to see if this node is the pr ...

  8. re模块中的非贪婪匹配

    python的re模块中有贪婪匹配和非贪婪匹配之分,当使用*时会匹配零个或多个,使用+时会匹配一个或多个.当使用?在前边特殊符号前时会进行非贪婪匹配,匹配零个或者一个,今天主要讨论非贪婪匹配中存在的坑 ...

  9. 010_Linux驱动之_DECLARE_WAIT_QUEUE_HEAD函数

    1. 功能:创建以个等待队列头 2. 函数原型 #define DECLARE_WAIT_QUEUE_HEAD (name)                            /     wait ...

  10. js的数组在内存中是如何存储的

    前言:本来想自己总结下,但发现以下文章已经写得很好,就直接放链接了. 英文文章:http://voidcanvas.com/javascript-array-evolution-performance ...