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 中执行系统外部命令
Oct 09 PHP
PHP与javascript的两种交互方式
Oct 09 PHP
?繁体转换的class
Oct 09 PHP
PHP统计目录下的文件总数及代码行数(去除注释及空行)
Jan 17 PHP
那些年一起学习的PHP(二)
Mar 21 PHP
基于simple_html_dom的使用小结
Jul 01 PHP
php需登录的文件上传管理系统
Mar 21 PHP
如何打开php的gd2库
Feb 09 PHP
PHP递归删除多维数组中的某个值
Apr 17 PHP
PHP实现微信小程序用户授权的工具类示例
Mar 05 PHP
php操作redis数据库常见方法实例总结
Feb 20 PHP
关于Anemometer图形化显示MySQL慢日志的工具搭建及使用的详细介绍
Jul 13 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
PHP初学者最感迷茫的问题小结
2010/03/27 PHP
php+ajax实现图片文件上传功能实例
2014/06/17 PHP
php实现递归抓取网页类实例
2015/04/03 PHP
php中的常用魔术方法汇总
2016/02/14 PHP
PHP错误和异常处理功能模块示例
2016/11/12 PHP
PHP cURL获取微信公众号access_token的实例
2018/04/28 PHP
Javascript 构造函数 实例分析
2008/11/26 Javascript
javascript 数组学习资料收集
2010/04/11 Javascript
克隆javascript对象的三个方法小结
2011/01/12 Javascript
JS对img进行操作(换图片/切图/轮换/停止)
2013/04/17 Javascript
通过遮罩层实现浮层DIV登录的js代码
2014/02/07 Javascript
js闭包实例汇总
2014/11/09 Javascript
js实现无限级树形导航列表效果代码
2015/09/23 Javascript
Vue.js每天必学之表单控件绑定
2016/09/05 Javascript
利用vue写todolist单页应用
2016/12/15 Javascript
nodejs发送http请求时遇到404长时间未响应的解决方法
2017/12/10 NodeJs
jQuery无冲突模式详解
2019/01/17 jQuery
3分钟了解vue数据劫持的原理实现
2019/05/01 Javascript
Vue的编码技巧与规范使用详解
2019/08/28 Javascript
vue 弹出遮罩层样式实例
2020/07/22 Javascript
python基于Tkinter库实现简单文本编辑器实例
2015/05/05 Python
Python递归遍历列表及输出的实现方法
2015/05/19 Python
python实现数值积分的Simpson方法实例分析
2015/06/05 Python
在Ubuntu系统下安装使用Python的GUI工具wxPython
2016/02/18 Python
详解字典树Trie结构及其Python代码实现
2016/06/03 Python
在python 中实现运行多条shell命令
2019/01/07 Python
python 采用paramiko 远程执行命令及报错解决
2019/10/21 Python
Python函数式编程指南:对生成器全面讲解
2019/11/19 Python
python GUI库图形界面开发之PyQt5信号与槽的高级使用技巧(自定义信号与槽)详解与实例
2020/03/06 Python
让IE支持CSS3的不完全兼容方案
2014/09/19 HTML / CSS
HTML5+WebSocket实现多文件同时上传的实例
2016/12/29 HTML / CSS
中专生自我鉴定书范文
2013/12/28 职场文书
竞选班干部演讲稿500字
2014/08/20 职场文书
2014年幼儿园园长工作总结
2014/12/17 职场文书
大学生暑假实习总结
2015/07/13 职场文书
同学聚会致辞集锦
2015/07/28 职场文书