本文实例讲述了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=如果太长则自动刪除一部分 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程序设计有所帮助。
【说明】:本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:)!