php图像处理类实例


Posted in PHP onJuly 28, 2015

本文实例讲述了php图像处理类。分享给大家供大家参考。具体如下:

<?php
/**
 * Image 类
 */
class Image {
 /**
 * @var string $fileName 文件名
 * @access private
 */
 private $fileName = '';
 /**
 * @var gd resource $imageResource 原图像
 * @access private
 */
 private $imageResource = NULL;
 /**
 * @var int $imageWidth 原图像宽
 * @access private
 */
 private $imageWidth = NULL;
 /**
 * @var int $imageHeight 原图像高
 * @access private
 */
 private $imageHeight = NULL;
 /**
 * @var int $imageType 原图像类型
 * @access private
 */
 private $imageType = NULL;
 /**
 * @var int $imageWidth 原图像宽
 * @access private
 */
 public $width = NULL;
 /**
 * @var int $imageHeight 原图像高
 * @access private
 */
 public $height = NULL;
 /**
 * @var int $imageType 原图像类型
 * @access private
 */
 public $type = NULL;
 /**
 * @var int $newResource 新图像
 * @access private
 */
 private $newResource = NULL;
 /**
 * @var int $newResType 新图像类型
 * @access private
 */
 private $newResType = NULL;
 /**
 * 构造函数
 * @param string $fileName 文件名
   */
 public function __construct($fileName = NULL) {
 $this->fileName = $fileName;
 if ($this->fileName) {
 $this->getSrcImageInfo();
 }
 }
 /**
 * 取源图像信息
 * @access private
 * @return void
 */
 private function getSrcImageInfo() {
 $info = $this->getImageInfo();
 $this->imageWidth = $info[0];
 $this->imageHeight = $info[1];
 $this->imageType = $info[2];
 $this->width = $info[0];
 $this->height = $info[1];
 $this->type = $info[2];
 }
 /**
 * 取图像信息
 * @param string $fileName 文件名
 * @access private
 * @return array
 */
 private function getImageInfo($fileName = NULL) {
 if ($fileName==NULL) {
 $fileName = $this->fileName;
 }
 $info = getimagesize($fileName);
 return $info;
 }
 /**
 * 创建源图像GD 资源
 * @access private
 * @return void
 */
 private function createSrcImage () {
 $this->imageResource = $this->createImageFromFile();
 }
 /**
 * 跟据文件创建图像GD 资源
 * @param string $fileName 文件名
 * @return gd resource
 */
 public function createImageFromFile($fileName = NULL)
 {
 if (!$fileName) {
 $fileName = $this->fileName;
 $imgType = $this->imageType;
 }
 if (!is_readable($fileName) || !file_exists($fileName)) {
  throw new Exception('Unable to open file "' . $fileName . '"');
 }
 if (!$imgType) {
 $imageInfo = $this->getImageInfo($fileName);
 $imgType = $imageInfo[2];
 }
 switch ($imgType) {
 case IMAGETYPE_GIF:
 $tempResource = imagecreatefromgif($fileName);
 break;
 case IMAGETYPE_JPEG:
 $tempResource = imagecreatefromjpeg($fileName);
 break;
 case IMAGETYPE_PNG:
 $tempResource = imagecreatefrompng($fileName);
 break;
 case IMAGETYPE_WBMP:
 $tempResource = imagecreatefromwbmp($fileName);
 break;
 case IMAGETYPE_XBM:
 $tempResource = imagecreatefromxbm($fileName);
 break;
 default:
 throw new Exception('Unsupport image type');
 }
 return $tempResource;
 }
 /**
 * 改变图像大小
 * @param int $width 宽
 * @param int $height 高
 * @param string $flag 一般而言,允许截图则用4,不允许截图则用1; 假设要求一个为4:3比例的图像,则:4=如果太长则自动?h除一部分 0=长宽转换成参数指定的 1=按比例缩放,自动判断太长还是太宽,长宽约束在参数指定内 2=以宽为约束缩放 3=以高为约束缩放
 * @param string $bgcolor 如果不为null,则用这个参数指定的颜色作为背景色,并且图像扩充到指定高宽,该参数应该是一个数组;
 * @return string
 */
 public function resizeImage($width, $height, $flag=1, $bgcolor=null) {
 $widthRatio = $width/$this->imageWidth;
 $heightRatio = $height/$this->imageHeight;
 switch ($flag) {
 case 1:
 if ($this->imageHeight < $height && $this->imageWidth < $width) {
 $endWidth = $this->imageWidth;
 $endHeight = $this->imageHeight;
 //return;
 } elseif (($this->imageHeight * $widthRatio)>$height) {
 $endWidth = ceil($this->imageWidth * $heightRatio);
 $endHeight = $height;
 } else {
 $endWidth = $width;
 $endHeight = ceil($this->imageHeight * $widthRatio);
 }
 break;
 case 2:
 $endWidth = $width;
 $endHeight = ceil($this->imageHeight * $widthRatio);
 break;
 case 3:
 $endWidth = ceil($this->imageWidth * $heightRatio);
 $endHeight = $height;
 break;
 case 4:
 $endWidth2 = $width;
 $endHeight2 = $height;
 if ($this->imageHeight < $height && $this->imageWidth < $width) {
 $endWidth = $this->imageWidth;
 $endHeight = $this->imageHeight;
 //return;
 } elseif (($this->imageHeight * $widthRatio)<$height) {
 $endWidth = ceil($this->imageWidth * $heightRatio);
 $endHeight = $height;
 } else {
 $endWidth = $width;
 $endHeight = ceil($this->imageHeight * $widthRatio);
 }
 break;
 default:
 $endWidth = $width;
 $endHeight = $height;
 break;
 }
 if ($this->imageResource==NULL) {
 $this->createSrcImage();
 }
 if($bgcolor){
 $this->newResource = imagecreatetruecolor($width,$height);
 $bg=ImageColorAllocate($this->newResource,$bgcolor[0],$bgcolor[1],$bgcolor[2]);
 ImageFilledRectangle($this->newResource,0,0,$width,$height,$bg);
 $tox=ceil(($width-$endWidth)/2);
 $toy=ceil(($height-$endHeight)/2);
 if($tox<0) $tox=0;
 if($toy<0) $toy=0;
 }else if ($flag==4) {
 $this->newResource = imagecreatetruecolor($endWidth2,$endHeight2);
 }else {
 $this->newResource = imagecreatetruecolor($endWidth,$endHeight);
 }
 $this->newResType = $this->imageType;
 imagecopyresampled($this->newResource, $this->imageResource, $tox, $toy, 0, 0, $endWidth, $endHeight,$this->imageWidth,$this->imageHeight);
 }
 /**
 * 给图像加水印
 * @param string $waterContent 水印内容可以是图像文件名,也可以是文字
 * @param int $pos 位置0-9可以是数组
 * @param int $textFont 字体大字,当水印内容是文字时有效
 * @param string $textColor 文字颜色,当水印内容是文字时有效
 * @return string
 */
 public function waterMark($waterContent, $pos = 0, $textFont=5, $textColor="#ffffff") {
 $isWaterImage = file_exists($waterContent);
 if ($isWaterImage) {
 $waterImgRes = $this->createImageFromFile($waterContent);
 $waterImgInfo = $this->getImageInfo($waterContent);
 $waterWidth = $waterImgInfo[0];
 $waterHeight = $waterImgInfo[1];
 } else {
 $waterText = $waterContent;
 //$temp = @imagettfbbox(ceil($textFont*2.5),0,"./cour.ttf",$waterContent);
 if ($temp) {
 $waterWidth = $temp[2]-$temp[6];
 $waterHeight = $temp[3]-$temp[7];
 } else {
 $waterWidth = 100;
 $waterHeight = 12;
 }
 }
 if ($this->imageResource==NULL) {
 $this->createSrcImage();
 }
 switch($pos) 
 { 
 case 0://随机 
 $posX = rand(0,($this->imageWidth - $waterWidth)); 
 $posY = rand(0,($this->imageHeight - $waterHeight)); 
 break; 
 case 1://1为顶端居左 
 $posX = 0; 
 $posY = 0; 
 break; 
 case 2://2为顶端居中 
 $posX = ($this->imageWidth - $waterWidth) / 2; 
 $posY = 0; 
 break; 
 case 3://3为顶端居右 
 $posX = $this->imageWidth - $waterWidth; 
 $posY = 0; 
 break; 
 case 4://4为中部居左 
 $posX = 0; 
 $posY = ($this->imageHeight - $waterHeight) / 2; 
 break; 
 case 5://5为中部居中 
 $posX = ($this->imageWidth - $waterWidth) / 2; 
 $posY = ($this->imageHeight - $waterHeight) / 2; 
 break; 
 case 6://6为中部居右 
 $posX = $this->imageWidth - $waterWidth; 
 $posY = ($this->imageHeight - $waterHeight) / 2; 
 break; 
 case 7://7为底端居左 
 $posX = 0; 
 $posY = $this->imageHeight - $waterHeight; 
 break; 
 case 8://8为底端居中 
 $posX = ($this->imageWidth - $waterWidth) / 2; 
 $posY = $this->imageHeight - $waterHeight; 
 break; 
 case 9://9为底端居右 
 $posX = $this->imageWidth - $waterWidth-20; 
 $posY = $this->imageHeight - $waterHeight-10; 
 break; 
 default://随机 
 $posX = rand(0,($this->imageWidth - $waterWidth)); 
 $posY = rand(0,($this->imageHeight - $waterHeight)); 
 break;   
 }
 imagealphablending($this->imageResource, true); 
 if($isWaterImage) {
 imagecopy($this->imageResource, $waterImgRes, $posX, $posY, 0, 0, $waterWidth,$waterHeight);  
 } else { 
 $R = hexdec(substr($textColor,1,2)); 
 $G = hexdec(substr($textColor,3,2)); 
 $B = hexdec(substr($textColor,5)); 
 $textColor = imagecolorallocate($this->imageResource, $R, $G, $B);
 imagestring ($this->imageResource, $textFont, $posX, $posY, $waterText, $textColor);     
 }
 $this->newResource = $this->imageResource;
 $this->newResType = $this->imageType;
 }
 /**
 * 生成验证码图片
 * @param int $width 宽
 * @param string $height 高
 * @param int $length 长度
 * @param int $validType 0=数字,1=字母,2=数字加字母
 * @param string $textColor 文字颜色
 * @param string $backgroundColor 背景颜色
 * @return void
 */
 public function imageValidate($width, $height, $length = 4, $validType = 1, $textColor = '#000000', $backgroundColor = '#ffffff') {
 if ($validType==1) {
 $validString = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
 $validLength = 52;
 } elseif ($validType==2) {
 $validString = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
 $validLength = 62;
 } else {
 $validString = '123456789';
 $validLength = 9;
 }
 srand((int)time());
 $valid = '';
 for ($i=0; $i<$length; $i++) {
 $valid .= $validString{rand(0, $validLength-1)};
 }
 $this->newResource = imagecreate($width,$height);
 $bgR = hexdec(substr($backgroundColor,1,2));
 $bgG = hexdec(substr($backgroundColor,3,2));
 $bgB = hexdec(substr($backgroundColor,5,2));
 $backgroundColor = imagecolorallocate($this->newResource, $bgR, $bgG, $bgB);
 $tR = hexdec(substr($textColor,1,2));
 $tG = hexdec(substr($textColor,3,2));
 $tB = hexdec(substr($textColor,5,2));
 $textColor = imagecolorallocate($this->newResource, $tR, $tG, $tB);
 for ($i=0;$i<strlen($valid);$i++){ 
 imagestring($this->newResource,5,$i*$width/$length+3,2, $valid[$i],$textColor); 
 }
 $this->newResType = IMAGETYPE_JPEG;
 return $valid;
 }
 /**
 * 显示输出图像
 * @return void
 */
 public function display($fileName='', $quality=100) {
 $imgType = $this->newResType;
 $imageSrc = $this->newResource;
    switch ($imgType) {
 case IMAGETYPE_GIF:
 if ($fileName=='') {
 header('Content-type: image/gif');
 }
 imagegif($imageSrc, $fileName, $quality);
 break;
 case IMAGETYPE_JPEG:
 if ($fileName=='') {
 header('Content-type: image/jpeg');
 }
 imagejpeg($imageSrc, $fileName, $quality);
 break;
 case IMAGETYPE_PNG:
 if ($fileName=='') {
 header('Content-type: image/png');
 imagepng($imageSrc);
 } else {
 imagepng($imageSrc, $fileName);
 }
 break;
 case IMAGETYPE_WBMP:
 if ($fileName=='') {
 header('Content-type: image/wbmp');
 }
 imagewbmp($imageSrc, $fileName, $quality);
 break;
 case IMAGETYPE_XBM:
 if ($fileName=='') {
 header('Content-type: image/xbm');
 }
 imagexbm($imageSrc, $fileName, $quality);
 break;
 default:
 throw new Exception('Unsupport image type');
 }
 imagedestroy($imageSrc);
 }
 /**
 * 保存图像
 * @param int $fileNameType 文件名类型 0使用原文件名,1使用指定的文件名,2在原文件名加上后缀,3产生随机文件名
 * @param string $folder 文件夹路径 为空为与原文件相同
 * @param string $param 参数$fileNameType为1时为文件名2时为后缀
 * @return void
 */
 public function save($fileNameType = 0, $folder = NULL, $param = '_miniature') {
 if ($folder==NULL) {
 $folder = dirname($this->fileName).DIRECTORY_SEPARATOR;
 }
 $fileExtName = FileSystem::fileExt($this->fileName, true);
 $fileBesicName = FileSystem::getBasicName($this->fileName, false);
 switch ($fileNameType) {
 case 1:
 $newFileName = $folder.$param;
 break;
 case 2:
 $newFileName = $folder.$fileBesicName.$param.$fileExtName;
 break;
 case 3:
 $tmp = date('YmdHis');
 $fileBesicName = $tmp;
 $i = 0;
 while (file_exists($folder.$fileBesicName.$fileExtName)) {
 $fileBesicName = $tmp.$i;
 $i++;
 }
 $newFileName = $folder.$fileBesicName.$fileExtName;
 break;
 default:
 $newFileName = $this->fileName;
 break;
 }
 $this->display($newFileName);
 return $newFileName;
 }
}
?>

希望本文所述对大家的php程序设计有所帮助。

PHP 相关文章推荐
php将数据库导出成excel的方法
May 07 PHP
PHP 魔术函数使用说明
May 14 PHP
PHP关联数组的10个操作技巧
Jan 21 PHP
浅谈apache和nginx的rewrite的区别
Feb 22 PHP
PHP对象递归引用造成内存泄漏分析
Aug 28 PHP
php+ajax实时输入自动搜索匹配的方法
Dec 26 PHP
Yii2组件之多图上传插件FileInput的详细使用教程
Jun 20 PHP
浅谈PHP eval()函数定义和用法
Jun 21 PHP
php封装的表单验证类完整实例
Oct 19 PHP
使用WAMP搭建PHP本地开发环境
May 10 PHP
PHP PDO和消息队列的个人理解与应用实例分析
Nov 25 PHP
yii 框架实现按天,月,年,自定义时间段统计数据的方法分析
Apr 04 PHP
图文介绍PHP添加Redis模块及连接
Jul 28 #PHP
PHP生成树的方法
Jul 28 #PHP
php计算税后工资的方法
Jul 28 #PHP
怎样搭建PHP开发环境
Jul 28 #PHP
php递归实现无限分类的方法
Jul 28 #PHP
php类自动加载器实现方法
Jul 28 #PHP
PHP实现的json类实例
Jul 28 #PHP
You might like
基于文本的访客签到簿
2006/10/09 PHP
Laravel 5框架学习之向视图传送数据(进阶篇)
2015/04/08 PHP
解决更换PHP5.4以上版本后Dedecms后台登录空白问题的方法
2015/10/23 PHP
php strftime函数获取日期时间(switch用法)
2018/05/16 PHP
php文件上传原理与实现方法详解
2019/12/20 PHP
特殊字符、常规符号及其代码对照表
2006/06/26 Javascript
javascript函数中的arguments参数
2010/08/01 Javascript
输入密码检测大写是否锁定js实现代码
2012/12/03 Javascript
屏蔽script注入小例子
2013/11/12 Javascript
设为首页和收藏的Javascript代码(亲测兼容IE,Firefox,chrome等浏览器)
2013/11/18 Javascript
DOM基础教程之事件类型
2015/01/20 Javascript
jquery插件splitScren实现页面分屏切换模板特效
2015/06/16 Javascript
解决jQuery uploadify在非IE核心浏览器下无法上传
2015/08/05 Javascript
jquery自定义表格样式
2015/11/23 Javascript
Javascript类型转换的规则实例解析
2016/02/23 Javascript
javascript显示倒计时控制按钮的简单实现
2016/06/07 Javascript
jQuery复制节点用法示例(clone方法)
2016/09/08 Javascript
AngularJS实现树形结构(ztree)菜单示例代码
2016/09/18 Javascript
Spring Boot+AngularJS+BootStrap实现进度条示例代码
2017/03/02 Javascript
Javascript中将变量转换为字符串的三种方法
2017/09/19 Javascript
vue router的基本使用和配置教程
2018/11/05 Javascript
实用的Vue开发技巧
2019/05/30 Javascript
400多行Python代码实现了一个FTP服务器
2012/05/10 Python
python基础教程之序列详解
2014/08/29 Python
Python中List.index()方法的使用教程
2015/05/20 Python
Django实现的自定义访问日志模块示例
2017/06/23 Python
几种实用的pythonic语法实例代码
2018/02/24 Python
flask 框架操作MySQL数据库简单示例
2020/02/02 Python
介绍一下结构化程序设计方法和面向对象程序设计方法的区别
2012/06/27 面试题
施工安全责任书范本
2014/07/24 职场文书
委托证明模板
2014/09/16 职场文书
大学生实训报告总结
2014/11/05 职场文书
机关单位保密工作责任书
2015/05/11 职场文书
军训心得体会范文(2016最新篇)
2016/01/11 职场文书
新课程改革心得体会
2016/01/22 职场文书
MySQL 常见的数据表设计误区汇总
2021/06/07 MySQL