<?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. [转]Spring Security Oauth2 认证流程

    1.本文介绍的认证流程范围 本文主要对从用户发起获取token的请求(/oauth/token),到请求结束返回token中间经过的几个关键点进行说明. 2.认证会用到的相关请求 注:所有请求均为po ...

  2. 【Distributed】网站跨域解决方案

    一.概述 1.1 什么是网站跨域 1.2 网站跨域报错案例 二.五种网站跨域解决方案 三.使用JSONP解决网站跨域[1] 3.1 前端代码 3.2 后端代码 四.使用设置响应头允许跨域[2] 4.1 ...

  3. nginx加入开机自启动

    1.首先,在linux系统的/etc/init.d/目录下创建nginx文件,使用如下命令:(vim /etc/init.d/nginx) 2.在/etc/init.d/nginx中写入以下脚本代码 ...

  4. golang GC(二 定位)

    前面已经介绍过golang的GC算法.要是我们的程序在运行是因为GC导致行能下降,该如何定位呢?说实话,工作中由于对go的gc问题不重视,根本没考虑过这个问题,今天特意来补补课.

  5. 7.MapReduce操作Hbase

    7 HBase的MapReduce   HBase中Table和Region的关系,有些类似HDFS中File和Block的关系.由于HBase提供了配套的与MapReduce进行交互的API如 Ta ...

  6. Vue 将一个组件嵌入到另一个组件中

    https://github.com/JasmineQian/Vue_Sample App.vue是所有组件的 要嵌入到App.vue组件中, 在script处导入 import xxx  from ...

  7. Ubuntu系统---报错Assertion '0' failed

    Ubuntu系统---报错Assertion '0' failed YOLO V3,CUDA Error: out of memory darknet: ./src/cuda.c:36: check_ ...

  8. vue 之 render 函数不能渲染非全局自定义函数-方案

    import customCom from 'xxx.vue' render: (h) => { return h(customCom) }

  9. python_面向对象——对象间的组合关系

    # 由一堆组件构成一个完整的实体,组建本身独立,但又不能自己运行,必须跟宿主组合在一起,运行. class Dog: #狗 def __init__(self,name,dog_type,attack ...

  10. python_tkinter弹出对话框2

    1.fledialog对话框 示例:askopenfilename(选择单个文件,获取文件路径) import tkinter # 导入消息对话框子模块 import tkinter.filedial ...