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获取youku视频真实flv文件地址的方法
Dec 23 PHP
PHP 验证登陆类分享
Mar 13 PHP
适用于初学者的简易PHP文件上传类
Oct 29 PHP
php for 循环使用的简单实例
Jun 02 PHP
PHP基于单例模式编写PDO类的方法
Sep 13 PHP
Laravel 5.1 on SAE环境开发教程【附项目demo源码】
Oct 09 PHP
thinkPHP批量删除的实现方法分析
Nov 09 PHP
php 遍历目录,生成目录下每个文件的md5值并写入到结果文件中
Dec 12 PHP
用PHP去掉文件头的Unicode签名(BOM)方法
Jun 22 PHP
详解PHP使用Redis存储session时的一个Warning定位
Jul 05 PHP
使用Entrust扩展包在laravel 中实现RBAC的功能
Mar 16 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
php精确的统计在线人数的方法
2015/10/21 PHP
《JavaScript高级程序设计》阅读笔记(三) ECMAScript中的引用类型
2012/02/27 Javascript
js去空格技巧分别去字符串前后、左右空格
2013/10/21 Javascript
JavaScript中的函数重载深入理解
2014/08/04 Javascript
通过JS获取Request.QueryString()参数的值实现方法
2016/09/27 Javascript
Angular2  NgModule 模块详解
2016/10/19 Javascript
vue.js初学入门教程(1)
2016/11/03 Javascript
jQuery层级选择器_动力节点节点Java学院整理
2017/07/04 jQuery
jQuery的Ajax接收java返回数据方法
2018/08/11 jQuery
jQuery实现参数自定义的文字跑马灯效果
2018/08/15 jQuery
JavaScript中的&quot;=、==、===&quot;区别讲解
2019/01/22 Javascript
vue通过数据过滤实现表格合并
2020/11/30 Javascript
vue开发拖拽进度条滑动组件
2019/09/21 Javascript
[56:41]iG vs Winstrike 2018国际邀请赛小组赛BO2 第二场
2018/08/17 DOTA
[01:06:12]VP vs NIP 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
编写Python CGI脚本的教程
2015/06/29 Python
利用Python为iOS10生成图标和截屏
2016/09/24 Python
利用python实现xml与数据库读取转换的方法
2017/06/17 Python
python dataframe astype 字段类型转换方法
2018/04/11 Python
Python 200行代码实现一个滑动验证码过程详解
2019/07/11 Python
PyCharm专业最新版2019.1安装步骤(含激活码)
2019/10/09 Python
解决Django no such table: django_session的问题
2020/04/07 Python
Keras构建神经网络踩坑(解决model.predict预测值全为0.0的问题)
2020/07/07 Python
基于CSS3 animation动画属性实现轮播图效果
2017/09/12 HTML / CSS
Amaze UI 文件选择域的示例代码
2020/08/26 HTML / CSS
澳大利亚在线家具店:Luxo Living
2019/03/24 全球购物
大四学生思想汇报
2014/01/13 职场文书
幼儿园美术教学反思
2014/01/31 职场文书
校运会口号
2014/06/18 职场文书
小学生五一劳动节演讲稿
2015/03/18 职场文书
2015年十月一日放假通知
2015/08/18 职场文书
2016年秋季运动会加油稿
2015/12/21 职场文书
子女赡养老人协议书
2016/03/23 职场文书
Redis三种集群模式详解
2021/10/05 Redis
SQL Server2019安装的详细步骤实战记录(亲测可用)
2022/06/10 SQL Server