PHP学习之图像处理-水印类
<?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学习之图像处理-水印类的更多相关文章
- c++ MFC图像处理CImage类常用操作代码
原文作者:aircraft 原文地址:https://www.cnblogs.com/DOMLX/p/9598974.html MFC图像处理CImage类常用操作 CImage类头文件为#inclu ...
- Java学习-041-颜色工具类(RGB,HEX)
在日常的网页开发中,经常需要进行颜色数值获取.转换,例如获取红色,获取蓝色,获取绿色,RGB转十六进制颜色,十六进制颜色转RGB等,因而在学习过程中,写了一个小工具类,仅供各位小主参考! 多不闲言,直 ...
- pdo文字水印类,验证码类,缩略图类,logo类
文字水印类 image.class.php <?php /** * webrx.cn qq:7031633 * @author webrx * @copyright copyright (c) ...
- PHP水印类
<?php /** * 水印类 * @author zhaoyingnan 2015/07/16 **/ include_once('extend.php'); class Watermark_ ...
- PHP 图片水印类
<?php /** * 加水印类,支持文字图片水印的透明度设置.水印图片背景透明. * $obj = new WaterMask($imgFileName); //实例化对象 * $obj-&g ...
- 图像处理JPEGCodec类错误问题 毕业设计遇到的问题
图像处理JPEGCodec类已经从Jdk1.7移除 2014-06-16 20:01:26 分类: 架构设计与优化 著名测试工具jira在使用图像处理JPEGCodec类会报告以下信息: 我是这样用 ...
- UML学习(二)-----类图
UML学习(二)-----类图 http://www.cnblogs.com/silent2012/archive/2011/09/07/2169946.html http://www.cnblogs ...
- (转)Qt Model/View 学习笔记 (七)——Delegate类
Qt Model/View 学习笔记 (七) Delegate 类 概念 与MVC模式不同,model/view结构没有用于与用户交互的完全独立的组件.一般来讲, view负责把数据展示 给用户,也 ...
- (转)Qt Model/View 学习笔记 (五)——View 类
Qt Model/View 学习笔记 (五) View 类 概念 在model/view架构中,view从model中获得数据项然后显示给用户.数据显示的方式不必与model提供的表示方式相同,可以与 ...
随机推荐
- ubuntu下使用libsvm
matlab上的代码已经八八九九了,因为涉及到GUI和网络编程的东西,所以不得已开始学python并在python上做完整版. 下面是如何在linux和python下使用libsvm 在你的pytho ...
- rabbit MQ 的环境及命令使用(一)
RabbitMQ依赖erlang,所以先安装erlang,然后再安装RabbitMQ; 先安装erlang,双击erlang的安装文件即可,然后配置环境变量: ERLANG_HOME=D:\Progr ...
- Linux命令——umask、setuid、setgid、sticky bit、chmod、chown
umask 权限遮罩码,用于控制文件,文件夹的默认权限 文件默认权限: 666-umask 文件夹默认权限: 777-umask 管理员root: umask= ...
- dbm和发射功率得对照表
原文链接:https://blog.csdn.net/nicholas_dlut/article/details/80950163dBm mW 下面是dbm和发射功率得对照表. 基本上市面上所有的无线 ...
- Mybatis在xml文件中处理大于、小于、不等于号的方法
在mapper.xml使用大于.小于等符号会和xml语法冲突,解决冲突有两种方式. 方法一: 使用转义字符: 字符名称 字符符号 转义字符 大于号 > > 小于号 < < 与 ...
- Java基础 String/StringBuff/StringBuilder 常用操作方法复习/内存分析/三者的效率比较
附:jdk1.8使用IDEA安装.创建.使用JUnit单元测试 笔记总结: /**String 复习 * 1.像C++这样的char arr[]="..." 的方式无法声明Java ...
- C# 截图不失真
Bitmap bmp = new Bitmap(@"E:\2222.jpg"); Bitmap bmp2 = bmp.Clone(new Rectangle(10 + 80, 15 ...
- jmeter接口测试-使用aes加密算法
好久没写文章了,一直在忙公司项目的事情!今天抽空写篇关于jmeter加密的教程吧! 随着互联网的发展,越来越多的系统开始提供接口调用! 我们进行接口测试的时候,大多数接口或多或少的都使用了各种加密验证 ...
- IntelliJ IDEA必装插件以及SpringBoot使用小技巧合集
IntelliJ IDEA必装插件 有不知道怎么安装的吗?File-->settings打开设置面板,找到plugins,输入想要安装的插件回车即可 1.背景图片 目前,IDEA支持设置背景图片 ...
- springboot2.0入门(六)-- ymal语法、数据校验
一.基本使用 1.ymal语法是一种更符合人类命名习惯的语法: # 1. 一个家庭有爸爸.妈妈.孩子. # 2. 这个家庭有一个名字(family-name)叫做“happy family” # 3. ...