自定义MVC框架之工具类-图像处理类
截止目前已经改造了4个类:
图像处理类:
1,图片加水印处理( 支持任意位置与九宫格位置 )
2,图片缩放处理( 等比缩放,不变形裁剪 )
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 ?>
作者:ghostwu, 出处:http://www.cnblogs.com/ghostwu
博客大多数文章均属原创,欢迎转载,且在文章页面明显位置给出原文连接