- <?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(!emptyempty($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(!emptyempty($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(!emptyempty($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;
复制代码
|