1 <?php 2 /** 3 * Image.php 4 * 5 * description 图像类 6 */ 7 8 namespace Imooc\Lib; 9 10 require_once 'GDBasic.php'; 11 12 class Image extends GDBasic 13 { 14 protected $_width; 15 protected $_height; 16 protected $_im; 17 protected $_type; 18 protected $_mime; 19 protected $_real_path; 20 21 22 public function __construct($file) 23 { 24 //检查GD库 25 self::check(); 26 $imageInfo = $this->createImageByFile($file); 27 $this->_width = $imageInfo['width']; 28 $this->_height = $imageInfo['height']; 29 $this->_im = $imageInfo['im']; 30 $this->_type = $imageInfo['type']; 31 $this->_real_path = $imageInfo['real_path']; 32 $this->_mime = $imageInfo['mime']; 33 } 34 35 36 /** 37 * 根据文件创建图像 38 * @param $file 39 * @return array 40 * @throws \Exception 41 */ 42 public function createImageByFile($file) 43 { 44 //检查文件是否存在 45 if(!file_exists($file)) 46 { 47 throw new \Exception('file is not exits'); 48 } 49 50 //获取图像信息 51 $imageInfo = getimagesize($file); 52 $realPath = realpath($file); 53 if(!$imageInfo) 54 { 55 throw new \Exception('file is not image file'); 56 } 57 58 switch($imageInfo[2]) 59 { 60 case IMAGETYPE_GIF: 61 $im = imagecreatefromgif($file); 62 break; 63 case IMAGETYPE_JPEG: 64 $im = imagecreatefromjpeg($file); 65 break; 66 case IMAGETYPE_PNG: 67 $im = imagecreatefrompng($file); 68 break; 69 default: 70 throw new \Exception('image file must be png,jpeg,gif'); 71 } 72 73 return array( 74 'width' => $imageInfo[0], 75 'height' => $imageInfo[1], 76 'type' => $imageInfo[2], 77 'mime' => $imageInfo['mime'], 78 'im' => $im, 79 'real_path' => $realPath, 80 ); 81 82 } 83 84 /** 85 * 缩略图 86 * @param int $width 缩略图高度 87 * @param int $height 缩略图宽度 88 * @return $this 89 * @throws \Exception 90 */ 91 public function resize($width, $height) 92 { 93 if(!is_numeric($width) || !is_numeric($height)) 94 { 95 throw new \Exception('image width or height must be number'); 96 } 97 //根据传参的宽高获取最终图像的宽高 98 $srcW = $this->_width; 99 $srcH = $this->_height; 100 101 if($width <= 0 || $height <= 0) 102 { 103 $desW = $srcW;//缩略图高度 104 $desH = $srcH;//缩略图宽度 105 } 106 else 107 { 108 $srcP = $srcW / $srcH;//宽高比 109 $desP = $width / $height; 110 111 if($width > $srcW) 112 { 113 if($height > $srcH) 114 { 115 $desW = $srcW; 116 $desH = $srcH; 117 } 118 else 119 { 120 $desH = $height; 121 $desW = round($desH * $srcP); 122 } 123 } 124 else 125 { 126 if($desP > $srcP) 127 { 128 $desW = $width; 129 $desH = round($desW / $srcP); 130 } 131 else 132 { 133 $desH = $height; 134 $desW = round($desH * $srcP); 135 } 136 } 137 } 138 139 //PHP版本小于5.5 140 if(version_compare(PHP_VERSION, '5.5.0', '<')) 141 { 142 $desIm = imagecreatetruecolor($desW, $desH); 143 if(imagecopyresampled($desIm, $this->_im, 0, 0, 0, 0, $desW, $desH, $srcW, $srcH)) 144 { 145 imagedestroy($this->_im); 146 $this->_im = $desIm; 147 $this->_width = imagesx($this->_im); 148 $this->_height = imagesy($this->_im); 149 } 150 } 151 else 152 { 153 if($desIm = imagescale($this->_im, $desW, $desH)) 154 { 155 $this->_im = $desIm; 156 $this->_width = imagesx($this->_im); 157 $this->_height = imagesy($this->_im); 158 } 159 160 } 161 162 return $this; 163 } 164 165 166 /** 167 * 根据百分比生成缩略图 168 * @param int $percent 1-100 169 * @return Image 170 * @throws \Exception 171 */ 172 public function resizeByPercent($percent) 173 { 174 if(intval($percent) <= 0) 175 { 176 throw new \Exception('percent must be gt 0'); 177 } 178 179 $percent = intval($percent) > 100 ? 100 : intval($percent); 180 181 $percent = $percent / 100; 182 183 $desW = $this->_width * $percent; 184 $desH = $this->_height * $percent; 185 return $this->resize($desW, $desH); 186 } 187 188 189 /** 190 * 图像旋转 191 * @param $degree 192 * @return $this 193 */ 194 public function rotate($degree) 195 { 196 $degree = 360 - intval($degree); 197 $back = imagecolorallocatealpha($this->_im,0,0,0,127); 198 $im = imagerotate($this->_im,$degree,$back,1); 199 imagesavealpha($im,true); 200 imagedestroy($this->_im); 201 $this->_im = $im; 202 $this->_width = imagesx($this->_im); 203 $this->_height = imagesy($this->_im); 204 return $this; 205 } 206 207 208 /** 209 * 生成水印 210 * @param file $water 水印图片 211 * @param int $pct 透明度 212 * @return $this 213 */ 214 public function waterMask($water ='',$pct = 60 ) 215 { 216 //根据水印图像文件生成图像资源 217 $waterInfo = $this->createImageByFile($water); 218 imagecopymerge(); 219 //销毁$this->_im 220 $this->_im = $waterInfo['im']; 221 $this->_width = imagesx($this->_im); 222 $this->_height = imagesy($this->_im); 223 return $this; 224 225 } 226 227 228 229 /** 230 * 图片输出 231 * @return bool 232 */ 233 public function show() 234 { 235 header('Content-Type:' . $this->_mime); 236 if($this->_type == 1) 237 { 238 imagegif($this->_im); 239 return true; 240 } 241 242 if($this->_type == 2) 243 { 244 imagejpeg($this->_im, null, 80); 245 return true; 246 } 247 248 if($this->_type == 3) 249 { 250 imagepng($this->_im); 251 return true; 252 } 253 } 254 255 /** 256 * 保存图像文件 257 * @param $file 258 * @param null $quality 259 * @return bool 260 * @throws \Exception 261 */ 262 public function save($file, $quality = null) 263 { 264 //获取保存目的文件的扩展名 265 $ext = pathinfo($file, PATHINFO_EXTENSION); 266 $ext = strtolower($ext); 267 if(!$ext || !in_array($ext, array('jpg', 'jpeg', 'gif', 'png'))) 268 { 269 throw new \Exception('image save file must be jpg ,png,gif'); 270 } 271 272 if($ext === 'gif') 273 { 274 imagegif($this->_im, $file); 275 return true; 276 } 277 if($ext === 'jpeg' || $ext === 'jpg') 278 { 279 if($quality > 0) 280 { 281 if($quality < 1) 282 { 283 $quality = 1; 284 } 285 if($quality > 100) 286 { 287 $quality = 100; 288 } 289 290 imagejpeg($this->_im, $file, $quality); 291 } 292 else 293 { 294 imagejpeg($this->_im, $file); 295 } 296 return true; 297 } 298 299 if($ext === 'png') 300 { 301 imagepng($this->_im, $file); 302 return true; 303 } 304 305 } 306 }
调用
require_once './lib/Image.php'; $image = new \Imooc\Lib\Image('../image/b.png'); //$image->resize(400,200)->save('../image/b_400_200.png'); $image->resizeByPercent(50)->rotate(1800)->show();