<?php /** * Image Class * Driver: GD Library * 暂时未处理当缩略图比原图片小时 无法添加水印的情况。 */ class Image { public $_sourceImg ; // 源图片 public $_tmpImg; // 操作图片 public $_imgType ; // 图片后缀 public $_create; // 执行方法 public $_save; // 保存方法 public function __construct($image) { if(is_file($image)){ @chmod($image, 0777); $this->_sourceImg = $image; $this->_imgType = pathinfo($image, PATHINFO_EXTENSION); $this->_tmpImg = dirname($image).'/'.'thumb_'.basename($image); @copy($this->_sourceImg, $this->_tmpImg); @chmod($this->_tmpImg,0777); switch($this->_imgType){ case 'gif' : $this->_save = "imagegif"; $this->_create = 'imagecreatefromgif'; break; case 'png' : $this->_save = "imagepng"; $this->_create = 'imagecreatefrompng'; break; case 'jpg' : case 'jpeg' : $this->_save = "imagejpeg"; $this->_create = 'imagecreatefromjpeg'; break; default : throw new Exception("ERROR; UNSUPPORTED IMAGE TYPE"); break; } }else{ throw new Exception($image.' is not a Image-Source!'); } } /* * 缩略图片 * @param width Integer 图片剪裁后宽度 * @param width Integer 图片剪裁后高度 * @param auto bool 是否等比例额剪裁 * @param xoffset Integer 剪裁左端偏移量 * @param yoffset Integer 剪裁顶端偏移量 ***/ function resize($width, $height, $auto = true, $xoffset = 0, $yoffset = 0){ if($width > $height){ $size = $width; }else{ $size = $height; } $_create = $this->_create; $_save = $this->_save; $img = $_create($this->_sourceImg); if($auto == TRUE){ list($org_width, $org_height) = getimagesize($this->_sourceImg); if($org_width < $size && $org_height < $size){ $img4= $img; }else{ if($org_width > $org_height){ $swidth = $size; $sheight = ($org_height/$org_width) * $size; $img4=imagecreatetruecolor ($swidth, $sheight); imagecopyresampled($img4, $img, 0, 0, 0, 0, $swidth, $sheight, $org_width, $org_height); }else{ $swidth = ($org_width/$org_height) * $size; $sheight = $size; $img4=imagecreatetruecolor ($swidth, $sheight); imagecopyresampled($img4, $img, 0, 0, 0, 0, $swidth, $sheight, $org_width, $org_height); } } $value = $this->_imgType == 'png' ? 9 : 100; $_save($img4,$this->_tmpImg,$value); $img = $_create($this->_tmpImg); }else{ // 自定义裁切 $img_n=imagecreatetruecolor($width, $height); imagecopyresized($img_n, $img, 0, 0, $xoffset, $yoffset, $width, $height, $width, $height); $value = $this->_imgType == 'png' ? 9 : 100; // PNG图片质量最高为9 其他格式为 100 默认为75 $_save($img_n,$this->_tmpImg,$value); } return $this; } /* * 添加水印 $gWaterPos = 9;//水印位置 0:随机 1:顶端居左 2:顶端居中 3:顶端居右 4:中部居左 5:中部居中 6:中部居右 7:底端居左 8:底端居中 9:底端居右 $gWaterMarkType = 'text';//text:用字符串作水印 img:用图片作水印 $groundImage = '' 原图 $gWaterImg = '1.jpg';//作为水印的图片,支持GIF,JPG,PNG格式 $gWaterText = 'text';//字符串内容 支持中文 $gWaterFontSize = 28;//字体大小 $gWaterTextColor = '#FF0000'; //字体颜色 $gWaterTtfFile = 'arial.ttf'; //ttf文件,可从C:/WINDOWS/Fonts得到 */ function makeWater($gWaterPos = 9, $gWaterMarkType='img', $groundImage = '',$gWaterImg='water.jpg',$gWaterText = '',$gWaterFontSize = 28,$gWaterTextColor= '#FF0000', $gwaterTtfFile = 'arial.ttf') { $groundImage = $this->_tmpImg; //读取水印文件 if($gWaterMarkType == 'img'){ if(!empty($gWaterImg) && file_exists($gWaterImg)) { list($water_w,$water_h,$water_t) = getimagesize($gWaterImg); switch($water_t) { case 1:$water_im = imagecreatefromgif($gWaterImg);break; case 2:$water_im = imagecreatefromjpeg($gWaterImg);break; case 3:$water_im = imagecreatefrompng($gWaterImg);break; default:die($formatMsg); } }else{ throw new Exception('the waterImg is not fined!'); } } //读取背景图片 if(!empty($groundImage) && file_exists($groundImage)) { list($ground_w,$ground_h,$ground_t) = getimagesize($groundImage); switch($ground_t) { case 1:$ground_im = imagecreatefromgif($groundImage);break; case 2:$ground_im = imagecreatefromjpeg($groundImage);break; case 3:$ground_im = imagecreatefrompng($groundImage);break; default:die($formatMsg); } }else{ throw new Exception('the BackgroundImg is not fined!'); } //水印位置 if($gWaterMarkType == 'img') { $w = $water_w; $h = $water_h; }else{ $temp = imagettfbbox(ceil($gWaterFontSize),0,$gWaterTtfFile,$gWaterText);//取得使用 TrueType 字体的文本的范围 $w = $temp[2] - $temp[6]; $h = $temp[3] - $temp[7]; unset($temp); } if($ground_w < $w || $ground_h < $h) { throw new Exception('the waterImg is too small!'); } switch($gWaterPos) { case 0://随机 $posX = rand(0,($ground_w - $w)); $posY = rand(0,($ground_h - $h)); break; case 1://1为顶端居左 $posX = 0; $posY = 0; break; case 2://2为顶端居中 $posX = ($ground_w - $w) / 2; $posY = 0; break; case 3://3为顶端居右 $posX = $ground_w - $w; $posY = 0; break; case 4://4为中部居左 $posX = 0; $posY = ($ground_h - $h) / 2; break; case 5://5为中部居中 $posX = ($ground_w - $w) / 2; $posY = ($ground_h - $h) / 2; break; case 6://6为中部居右 $posX = $ground_w - $w; $posY = ($ground_h - $h) / 2; break; case 7://7为底端居左 $posX = 0; $posY = $ground_h - $h; break; case 8://8为底端居中 $posX = ($ground_w - $w) / 2; $posY = $ground_h - $h; break; case 9://9为底端居右 $posX = $ground_w - $w; $posY = $ground_h - $h; break; default://随机 $posX = rand(0,($ground_w - $w)); $posY = rand(0,($ground_h - $h)); break; } //设定图像的混色模式 imagealphablending($ground_im, true); if($gWaterMarkType == 'img'){ imagecopy($ground_im, $water_im, $posX, $posY, 0, 0, $water_w,$water_h);//拷贝水印到目标文件 }else{ if(!empty($gWaterTextColor) && (strlen($gWaterTextColor)==7) ) { $R = hexdec(substr($gWaterTextColor,1,2)); $G = hexdec(substr($gWaterTextColor,3,2)); $B = hexdec(substr($gWaterTextColor,5)); }else{ throw new Exception('The waterText color format error!'); } imagettftext($ground_im,$gWaterFontSize,0,$posX,$posY,imagecolorallocate($ground_im,$R,$G,$B),$gWaterTtfFile, iconv("GB2312","UTF-8",$gWaterText)); } //生成水印后的图片 @unlink($groundImage); switch($ground_t) { case 1:imagegif($ground_im,$groundImage);break; case 2:imagejpeg($ground_im,$groundImage);break; case 3:imagepng($ground_im,$groundImage);break; default:throw new Exception('The backgoundImage is not Support MakeWaterImage!'); } //释放内存 if(isset($water_info)){ unset($water_info); } if(isset($water_im)){ imagedestroy($water_im); } unset($ground_info); imagedestroy($ground_im); return $this; } /* * 返回处理后的图片地址 * @param old bool 是否替换原图 * return String **/ public function save($old = false) { if($old){ @unlink($this->_sourceImg); @rename($this->_tmpImg, $this->_sourceImg); return $this->_sourceImg; } return $this->_tmpImg; } /* * 显示图片 * @paras source String 图片路径 **/ public function render($source = TRUE) { switch($this->_imgType){ case 'jpg': case 'jpeg': header('Content-Type: image/jpeg'); break; case 'gif': header('Content-Type: image/gif'); break; case 'png': header('Content-Type: image/png'); break; } $imgSrc = $source ? $this->_sourceImg : $this->_tmpImg; $_create = $this->_create; $_save = $this->_save; $source = $_create($imgSrc); $_save($source); imagedestroy($imgResource); } } 测试用例 //$img = new Image('test.jpg'); //$img->render(); $saveFileName = $img->resize(200,200,false,300,100)->makewater(9)->save();//自定义裁切 添加水印 //$saveFileName = $img->resize(200,200)->save(); // 等比例缩略 //$saveFileName = $img->resize(300,200)->makewater(9)->save(); // 等比例缩略 添加水印 //$saveFileName = $img->makewater(1)->save(); // 制作水印 //echo $saveFileName;