我们对图片的处理主要是添加水印和等比缩放,在PHP中,封装一个类来实现两个功能。

源代码如下:

<?php/***图片处理*/
class Image
{//路径private $path = './upload/';//随机文件名private $isRandName;//初始化成员方法public function __construct($path = null , $r = true){if (!is_null($path)) {$this->path = rtrim($path,'/').'/';}$this->isRandName = $r;}//water水印的方法//源(图片 $dst)  目标(水印 $src)  位置(9宫格) 前缀($prefix) 透明度($tmd )public function water($dst,$src,$pos = 9,$prefix = 'wa_', $tmd = 100){//判断文件路径是否存在$src = $this->path . $src;if (!file_exists($dst) || !file_exists($src)) {exit('图片或者水印不存在');}//获取图像(图片和水印)的相关信息$dstInfo = self::getImageInfo($dst);$srcInfo = self::getImageInfo($src);//var_dump($dstInfo);//判断宽高是否超过了目标图片的宽高if (!$this->_checkSize($dstInfo,$srcInfo)) {exit('水印图片的宽、高不合法');}//摆放位置  1 2 3 4 5 6 7 8 9 九宫格(3行3列)$postion = self::getPostion($dstInfo,$srcInfo,$pos);//打开图片$dstRes = self::openImage($dst,$dstInfo);$srcRes = self::openImage($src,$srcInfo);//将两个图片合并在一起  通过两张图片信息将图片合并在一起  需要自定义一个方法$newRes = $this->_mergeImage($dstRes,$srcRes,$postion,$dstInfo,$srcInfo,$tmd);//判断是否允许随机命名【保存之前】if ($this->isRandName) {//路径 前缀 产生id .  后缀//uniqid() 获取一个带前缀、基于当前时间微秒数的唯一ID$path = $this->path.$prefix . uniqid(). '.' .$dstInfo['subfix'];} else {//路径 前缀 文件原名$path = $this->path.$prefix . $dstInfo['basename'];}//保存图片self::saveImage($newRes,$path,$dstInfo);//销毁资源p_w_picpathdestroy($dstRes);p_w_picpathdestroy($srcRes);//返回路径}//等比缩放//源图片 宽 高 前缀public function thump($dst,$width,$height,$prefix = 'thump_'){//判断文件是否存在if (!file_exists($dst)) {exit('文件路径不存在');}//获取图像的信息  没有信息就退出$info = self::getImageInfo($dst);//得到一个新的尺寸$newSize = self::getNewSize($width,$height,$info);//打开资源$res = self::openImage($dst,$info);//等比缩放这个资源  处理gif背景变黑的问题$newRes = self::kidOfImage($res,$newSize,$info);//保存$path = $this->path.$prefix.$info['basename'];self::saveImage($newRes,$path,$info);//销毁资源p_w_picpathdestroy($newRes);//返回路径return $path;}//等比缩放处理private static function kidOfImage($srcImg, $size, $imgInfo){$newImg = p_w_picpathcreatetruecolor($size["width"], $size["height"]);$otsc = p_w_picpathcolortransparent($srcImg);if ( $otsc >= 0 && $otsc < p_w_picpathcolorstotal($srcImg)) {$transparentcolor = p_w_picpathcolorsforindex( $srcImg, $otsc );$newtransparentcolor = p_w_picpathcolorallocate($newImg,$transparentcolor['red'],$transparentcolor['green'],$transparentcolor['blue']);p_w_picpathfill( $newImg, 0, 0, $newtransparentcolor );p_w_picpathcolortransparent( $newImg, $newtransparentcolor );}p_w_picpathcopyresized( $newImg, $srcImg, 0, 0, 0, 0, $size["width"], $size["height"], $imgInfo["width"], $imgInfo["height"] );p_w_picpathdestroy($srcImg);return $newImg;}//得到一个新的尺寸private static function getNewSize($width, $height, $imgInfo){$size["width"] = $imgInfo["width"];   //将原图片的宽度给数组中的$size["width"]$size["height"] = $imgInfo["height"];  //将原图片的高度给数组中的$size["height"]if($width < $imgInfo["width"]) {$size["width"] = $width;             //缩放的宽度如果比原图小才重新设置宽度}if ($width < $imgInfo["height"]) {$size["height"] = $height;            //缩放的高度如果比原图小才重新设置高度}if($imgInfo["width"]*$size["width"] > $imgInfo["height"] * $size["height"]) {$size["height"] = round($imgInfo["height"] * $size["width"] / $imgInfo["width"]);} else {$size["width"] = round($imgInfo["width"] * $size["height"] / $imgInfo["height"]);}return $size;}//获取图片的相关信息public static function getImageInfo($path){$data = [];//获取图片大小$info = getp_w_picpathsize($path);//var_dump($info);//根据打印出来的信息 将键所对应的值(文件的大小)赋值给data的数组中$data['width'] = $info[0];$data['height'] = $info[1];$data['mime'] = $info['mime'];//获取路径  后缀 文件名信息$path = pathinfo($path);//var_dump($path);die;//根据打印出来的信息 将将键所对应的值(路径和文件名)赋值给data的数组中$data['basename'] = $path['basename'];$data['subfix'] = $path['extension'];return $data;}//检查图片和水印的宽高//将图片的宽高和水印的宽高进行比较private function _checkSize($dstInfo,$srcInfo){//水印的宽应该小于图片的宽度或者水印的高度应该小于图片的高度 ,只要其中一个不满足就不能继续if ($dstInfo['width'] < $srcInfo['width'] || $dstInfo['height'] < $srcInfo['height']) {return false;}return true;}//位置处理public static function getPostion($dstInfo,$srcInfo,$pos){switch ($pos) {case 1:$x = 0;$y = 0;break;case 2:$x = ceil(($dstInfo['width'] - $srcInfo['width']) / 2 );$y = 0;break;case 3:$x = $dstInfo['width'] - $srcInfo['width'];$y = 0;break;case 4:$x = 0;$y = ceil(($dstInfo['height'] - $srcInfo['height']) / 2 );break;case 5:$x = ceil(($dstInfo['width'] - $srcInfo['width']) / 2 );$y = ceil(($dstInfo['height'] - $srcInfo['height']) / 2 );break;case 6:$x = $dstInfo['width'] - $srcInfo['width'];$y = ceil(($dstInfo['height'] - $srcInfo['height']) / 2 );break;case 7:$x = 0;$y = $dstInfo['height'] - $srcInfo['height'];break;case 8:$x = ceil(($dstInfo['width'] - $srcInfo['width']) / 2 );$y = $dstInfo['height'] - $srcInfo['height'];break;case 9:$x = $dstInfo['width'] - $srcInfo['width'];$y = $dstInfo['height'] - $srcInfo['height'];break;}return ['x' => $x ,'y' =>$y];}//打开图片//根据图片的类型打开相应的图片资源private function openImage($path,$info){switch ($info['mime']) {case 'p_w_picpath/png':case 'p_w_picpath/x-png':$res = p_w_picpathcreatefrompng($path);break;case 'p_w_picpath/jpeg':case 'p_w_picpath/jpg':case 'p_w_picpath/pjpeg':$res = p_w_picpathcreatefromjpeg($path);break;case 'p_w_picpath/gif':$res = p_w_picpathcreatefromgif($path);break;case 'p_w_picpath/wbmp':case 'p_w_picpath/bmp':$res = p_w_picpathcreatefromwbmp($path);break;}//var_dump($res);die;return $res;}//合并图片 p_w_picpathcopymerge(图片,水印,图片坐标x,图片坐标y,水印坐标x,水印坐标y,透明度)private function _mergeImage($dstRes,$srcRes,$postion,$dstInfo,$srcInfo,$tmd){p_w_picpathcopymerge($dstRes,$srcRes,$postion['x'],$postion['y'],0,0,$srcInfo['width'],$srcInfo['height'],$tmd);return $dstRes;}//保存图片处理方法//参数:需要保存的图片资源,保存的路径,保存的信息public static function saveImage($res,$path,$info){//根据不同的图片类型选择不同的函数进行保存switch ($info['mime']) {case 'p_w_picpath/png':case 'p_w_picpath/x-png':p_w_picpathpng($res,$path);break;case 'p_w_picpath/jpeg':case 'p_w_picpath/jpg':case 'p_w_picpath/pjpeg':p_w_picpathjpeg($res,$path);break;case 'p_w_picpath/gif':p_w_picpathgif($res,$path);break;case 'p_w_picpath/wbmp':case 'p_w_picpath/bmp':p_w_picpathwbmp($res,$path);break;}}
}

测试代码:

$img = new Image();
/*
$img->water('ly.png','logo.gif',3);
$img->water('ly.png','logo.gif',4);*/$img->thump('ly.png',100,100,'l1_');

转载于:https://blog.51cto.com/chensenlin/1855589

PHP中面向对象的图片处理类相关推荐

  1. java猫抓老鼠_用猫抓老鼠的实例理解java中面向对象的编程与类和对象以及方法的概念...

    今天看到马士兵讲的关于面向对象编程的思路,用了一个猫抓老鼠的例子,我觉得这个例子非常形象,于是写在这里,方便学习理解和以后查看 class cat{ //声明一个类–"猫" int ...

  2. 类的扩充 js中面向对象的技术

    类的扩充 ps,纠正之前的一个错误,之前直接重新提交函数的,而重新提交函数表明这是讲之前的函数清空,重新引用,注意:这样的话已经不存在引用关系,所以这样对于类的修改,不会影响其原先继承的修改 类的扩充 ...

  3. java在容器中导入图片_Java程序员必学技术:@Import直接导入类,在容器@Configuration、@Component中是怎么直接导入类注册到容器的?...

    Java程序员必学技术:@Import直接导入类,在容器@Configuration.@Component中是怎么直接导入类注册到容器的? Spring IoC 容器是一个管理 Bean 的容器,在 ...

  4. javascript 中面向对象实现 如何继承

    上一篇博客已经说了关于javascript中的封装, 其中也说了javascript中本来是没有类的,我们上一篇的封装也是用javascript中的函数去模拟一个类,最后我们还模拟了一个构造函数.那 ...

  5. [转载] Java中如何引用另一个类里的集合_Java工程师面试题整理

    参考链接: 在Java中将预定义的类名用作类或变量名 花了一星期把学过的都整理一遍 尽量易懂,从基础到框架 最新版大厂面经汇总出炉,持续更新中 汇总完了上传网盘,设计到后端架构师的一切知识 如果没更新 ...

  6. jdbc mysql查询显示图片_JDBC【向数据库中存入读取图片】

    JDBC-向数据库中存入读取图片 注:此代码依赖自定义的数据库连接工具类 1.向数据库存入一张照片 import java.io.File; import java.io.FileInputStrea ...

  7. 【面向对象编程】(1) 类实例化的基本方法

    各位同学好,本章节和大家分享一下面向对象编程的一些方法,通过一些案例带大家由浅入深掌握面向对象的编程. 1. 最基本的类实例化 创建类的方法是 class 变量名: ,实例化方法是 类名() ,分配属 ...

  8. Android Handler 异步消息处理机制的妙用 创建强大的图片载入类

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38476887 ,本文出自[张鸿洋的博客] 近期创建了一个群.方便大家交流,群号: ...

  9. python对象编程例子-python面向对象编程:python类和实例讲解

    东尧爱分享 这是东尧每天一篇文章的第51天 东尧写文章的目标:分享东尧的经验和思考,帮你获取物质和精神两方面幸福. 1 什么是对象 在python里面,一切皆为对象.也就是说python里的所有数据都 ...

最新文章

  1. ubuntu添加sudo权限
  2. ValueError: Classification metrics can‘t handle a mix of multiclass and unknown targets
  3. DV型、OV型、EV型三种SSL证书 区别
  4. 皮一皮:这是人干的事?
  5. mysql 学习笔记07日期相关函数01
  6. 5G时代,怎样的数据库才能满足金融领域快速发展的需求?
  7. python do while语句_python控制语句执行流程(while)
  8. ie 无法运行php,PHP会话无法在IE中运行
  9. Horizon View 7 发布Win10桌面三:链接克隆桌面池配置
  10. QObject::connect: Cannot queue arguments of type xxx的解决方案
  11. linux任务计划、chkconfig工具、systemd、unit和target介绍
  12. 使用OD修改程序窗口标题和提示信息
  13. 【学习】从零开始的Android音视频开发(6)——MediaPlayerService中BinderDriver、创建播放器过程、建立StageFright层交互
  14. 笔记本电脑刚回来没有计算机,刚买笔记本电脑我的笔记本电脑没有光驱,如果重新安装系统,怎么样操 爱问知识人...
  15. Fedora 17: 安装 perl-Tk
  16. 【暴力枚举】二进制枚举-幼儿园买玩具
  17. IT人才招聘一位资深HR前辈写给新人的成长启示录
  18. STM32学习笔记(一)丨建立工程丨GPIO 通用输入输出
  19. 用IO口时注意是FT和TTa
  20. 管理批量邮箱 FOXMAIL 和网易闪电邮(PC端)有什么区别? 对比

热门文章

  1. leetcode270. 最接近的二叉搜索树值
  2. leetcode27 移除元素
  3. 树和二叉树【数据结构】
  4. PaperNotes(10)-Maximum Entropy Generators for Energy-Based Models
  5. STL源码剖析 queue队列概述
  6. 论文遇到的格式问题和修正方式
  7. 2000年考研英语阅读理解文章二
  8. 三十功名尘与土——资深程序员生涯自白
  9. 项目经理沟通的四个好习惯
  10. H.264视频编解码的代码移植和优化