自定义MVC框架之工具类-图像处理类

2018-03-01 07:49:11来源:cnblogs.com作者:ghostwu人点击

分享

截止目前已经改造了4个类:

ubuntu:通过封装验证码类库一步步安装php的gd扩展

自定义MVC框架之工具类-分页类的封装

自定义MVC框架之工具类-文件上传类

图像处理类:

1,图片加水印处理( 支持任意位置与九宫格位置 )

2,图片缩放处理( 等比缩放,不变形裁剪 )

  1 <?php  2   3 class Image{  4     //文件路径  5     protected $path;  6     //是否允许随机文件名称  7     protected $enableRandName;  8     //文件类型  9     protected $type; 10     //错误号 11     protected $errorNo; 12     //错误信息 13     protected $errorInfo; 14  15     public function __construct( $_path = './', $_enableRandName = true ){ 16         $this->path = $_path; 17         $this->enableRandName = $_enableRandName; 18     } 19  20     public function __get( $key ) { 21         if( $key == 'errorNo' ) { 22             return $this->errorNo; 23         }else if( $key == 'errorInfo' ) { 24             return $this->getErrorInfo(); 25         } 26     }  27     protected function getErrorInfo(){ 28         $info = ''; 29         switch( $this->errorNo ){ 30             case 1000: 31                 $info = "水印或者图片源文件不存在";                 32                 break; 33             case 1001: 34                 $info = '水印图片的尺寸(宽或者高)大于图片本身'; 35                 break; 36         } 37         return $info; 38     } 39  40     //获取图片信息 41     public static function getImageInfo( $imgPath ){ 42         $data = getimagesize( $imgPath ); 43         $info['width'] = $data[0]; 44         $info['height'] = $data[1]; 45         $info['mime'] = $data['mime']; 46         return $info; 47     } 48  49     /* 50      *    @srcImg 原图片 51      *    @waterImg 水印图片 52      *    @pos 水印位置 53      *    @alpha 透明度 54      *    @prefix 水印处理之后的图片前缀 55      * */ 56     public function waterMark( $srcImg, $waterImg, $pos, $alpha, $prefix = 'ghostwu_' ){ 57         //检查图片和水印是否存在 58         if( !file_exists( $srcImg )  59             || !file_exists( $waterImg ) ) { 60             $this->errorNo = 1000; 61             return false; 62         }  63  64         //获取图片和水印信息 65         $srcImageInfo = self::getImageInfo( $srcImg ); 66         $waterImageInfo = self::getImageInfo( $waterImg ); 67  68         $this->type = explode( '/', $srcImageInfo['mime'] )[1]; 69  70         //检查水印和图片的尺寸, 水印是否能加在图片上 71         if( !$this->check( $srcImageInfo, $waterImageInfo ) ) { 72             $this->errorNo = 1001; 73             return false; 74         } 75  76         //打开图片文件和水印文件资源 77         $imgRes = self::openImage( $srcImg ); 78         $waterRes = self::openImage( $waterImg ); 79  80         //计算水印图片位置     81         $waterPos = $this->calcPosition( $pos, $srcImageInfo, $waterImageInfo ); 82  83         //合成水印图片 84         imagecopymerge ( $imgRes, $waterRes, $waterPos['x'], $waterPos['y'], 0, 0, $waterImageInfo['width'], $waterImageInfo['height'], $alpha ); 85  86         //得到文件的保存名字 87         $saveName = $this->getFileName( $srcImg, $prefix ); 88  89         //拼凑完整的文件名称 90         $fullPath = rtrim( $this->path, '/' ) . '/' . $saveName; 91          92         //保存添加水印后的文件 93         $this->saveImage( $imgRes, $fullPath ); 94  95         imagedestroy( $imgRes ); 96         imagedestroy( $waterRes ); 97  98         return $fullPath; 99     }100 101     protected function saveImage( $imgRes, $fullPath ){102         $func = 'image' . $this->type;103         $func( $imgRes, $fullPath );104     }105 106     protected function getFileName( $imgPath, $prefix ){107         if ( $this->enableRandName ) {108             $saveName = $prefix . uniqid() . '.' . $this->type;109         }else {110             $saveName = $prefix . pathinfo( $imgPath )['filename'] . '.' . $this->type;111         }112         return $saveName;113     }114 115     protected function calcPosition( $pos, $imageInfo, $waterImageInfo ){116         $x = 0; $y = 0;117         switch( $pos ) {118             case 1: //左上角119                 $x = 0; $y = 0;120                 break;121             case 2: //上中122                 $x = ( $imageInfo['width'] - $waterImageInfo['width'] ) / 2;123                 $y = 0;124                 break;125             case 3: //右上角126                 $x = $imageInfo['width'] - $waterImageInfo['width'];127                 $y = 0;128                 break;129             case 4: //左边中间130                 $x = 0;131                 $y = ( $imageInfo['height'] - $waterImageInfo['height'] ) / 2;132                 break;133             case 5: //正中间134                 $x = ( $imageInfo['width'] - $waterImageInfo['width'] ) / 2;135                 $y = ( $imageInfo['height'] - $waterImageInfo['height'] ) / 2;136                 break;137             case 6: //右边中间138                 $x = $imageInfo['width'] - $waterImageInfo['width'];139                 $y = ( $imageInfo['height'] - $waterImageInfo['height'] ) / 2;140                 break;141             case 7: //左下角142                 $x = 0;143                 $y = $imageInfo['height'] - $waterImageInfo['height'];144                 break;145             case 8: //中间下面146                 $x = ( $imageInfo['width'] - $waterImageInfo['width'] ) / 2;147                 $y = $imageInfo['height'] - $waterInfo['height'];148                 break;149             case 9: //右下角150                 $x = $imageInfo['width'] - $waterImageInfo['width'];151                 $y = $imageInfo['height'] - $waterImageInfo['height'];152                 break;153             case 0: //随机位置154                 $x = mt_rand( 0, $imageInfo['width'] - $waterImageInfo['width'] );155                 $y = mt_rand( 0, $imageInfo['height'] - $waterImageInfo['height'] );156                 break;157         }158         return [ 'x' => $x, 'y' => $y ];159     }160 161     public static function openImage( $imagePath ){162         $mime = self::getImageInfo( $imagePath )['mime'];163         switch( $mime ){164             case 'image/gif':165                 $im = imagecreatefromgif( $imagePath );166                 break;167             case 'image/jpeg':168                 $im = imagecreatefromjpeg( $imagePath );169                 break;170             case 'image/png':171                 $im = imagecreatefrompng( $imagePath );172                 break;173             case 'image/wbmp':174                 $im = imagecreatefromwbmp( $imagePath );175                 break;176         }177         return $im;178     }179 180     public function check( $imgInfo, $waterInfo ){181         if( $imgInfo['width'] < $waterInfo['width']182            || $imgInfo['height'] < $waterInfo['height'] ){183             return false;184         }185         return true;186     }187 188     /*189      * @srcImg 原图片路径190      * @dstImg 目标图片路径191      * @newWidth 缩放后新的图片宽度192      * @newHeight 缩放后新的图片高度193      * */194     public function thumb( $srcImg, $newWidth, $newHeight, $prefix="thumb_" ){195         $srcIm = self::openImage( $srcImg );196         $srcInfo = self::getImageInfo( $srcImg );197         $srcW = $srcInfo['width'];198         $srcH = $srcInfo['height'];199         $this->type = explode( '/', $srcInfo['mime'] )[1];200         $ratio_w = $newWidth / $srcW;201         $ratio_h = $newHeight / $srcH;202         $ratio = 1.0;203 204         //缩放后的图片 宽度/高度 都比原图大或者小205         if( ( $ratio_w < 1 && $ratio_h < 1 ) || ( $ratio_w > 1 && $ratio_h > 1 ) ) {206             if( $ratio_w < $ratio_h ) {207                 $ratio = $ratio_h;208             }else {209                 $ratio = $ratio_w;210             }211             $tmp_w = (int)( $newWidth / $ratio );212             $tmp_h = (int)( $newHeight / $ratio );213             $tmp_im = imagecreatetruecolor( $tmp_w, $tmp_h );214             //生成一个以原图片最大边长,比例为ratio的中间图像215             imagecopy( $tmp_im, $srcIm, 0, 0, 0, 0, $tmp_w, $tmp_h );216             //定义一个目标尺寸的图像217             $newIm = imagecreatetruecolor( $newWidth, $newHeight );218             imagecopyresampled( $newIm, $tmp_im, 0, 0, 0, 0, $newWidth, $newHeight, $tmp_w, $tmp_h );219         }else {220         //缩放后的图片 宽度/高度 一个比原图大, 另一个比原图小221             $ratio = $ratio_h > $ratio_w ? $ratio_h : $ratio_w; //取比例大的那个值222 223             $tmp_w=(int)($srcW * $ratio);224             $tmp_h=(int)($srcH * $ratio);225             $tmp_im = imagecreatetruecolor($tmp_w, $tmp_h);226 227             imagecopyresampled($tmp_im, $srcIm, 0, 0, 0, 0, $tmp_w, $tmp_h, $srcW, $srcH );228 229             $newIm = imagecreatetruecolor($newWidth, $newHeight);230             imagecopy($newIm, $tmp_im, 0, 0, 0, 0, $newWidth, $newHeight);231         }232         //处理后的文件的保存名字233         $saveName = $this->getFileName( $newIm, $prefix );234 235         //拼凑完整的文件名称236         $fullPath = rtrim( $this->path, '/' ) . '/' . $saveName;237         238 239         $this->saveImage( $newIm, $fullPath );240 241         imagedestroy( $newIm );242 243         return $fullPath;244     }245 }246 247 $img = new Image();248 //$img->waterMark( '1.jpg', 'logo.png', 5, 30 );249 echo $img->thumb( '1.jpg', 330, 495 );250 251 252 ?>

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台