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

来源:转载

截止目前已经改造了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 ?>

分享给朋友:
您可能感兴趣的文章:
随机阅读: