1 class ThumbImages{
2 /**
3 * 生成缩略图
4 * prorate 按比例缩放
5 * distortion 扭曲型缩图
6 * cut 最小裁剪后的缩图
7 * backFill 背景填充图
8 * clssname ThumbImages
9 * createtime:2014-1-14下午04:44:28
10 * author:lhm
11 * for example
12 * include ‘ThumbImages.class.php‘
13 * $th=new ThumbImages(array(‘imagePre‘=>‘‘,
14 * ‘imagePath‘=>‘./uploads/thumb/‘,
15 * ‘echoType‘=>‘file‘));
16 * $th->setThumb($srcImage, 384, 300, ‘prorate‘);
17 */
18 private $imagepre; //缩略图名称前缀
19 private $imagepath; //缩略图存放路径
20 private $srcImage=‘‘; //源图路径
21 private $newImageName; //缩略图名称
22 private $imageType; //图片类型
23 private $echotype; //输出图片类型,link--直接输出到浏览器;file--保存为文件
24 private $im=‘‘; //临时变量
25 private $originName=‘‘; //源图名称
26 private $srcW=‘‘; //源图宽
27 private $srcH=‘‘; //源图高
28 private $errorNum=0; //错误号
29 private $errorMess=‘‘;//用来提供错误报告
30
31
32 public function __construct($options = array()){
33 $allowOption = array(‘imagepre‘,‘imagepath‘,‘echotype‘);
34 foreach($options as $key=>$val){
35 $key = strtolower($key);
36 //查看用户参数中数组的下标是否和成员属性名相同
37 //if(!in_array($key,get_class_vars(get_class($this)))){
38 if(!in_array($key, $allowOption)){
39 $this->errorNum = -3;
40 $this->errorMess = $this->getError();
41 continue 1;
42 }
43 $this->$key = $val;
44 }
45 }
46 /**
47 *
48 * 判断源文件路径、缩略图存放路径是否正确
49 * 判断GD库是否支持缩略图格式
50 * 初始化图片高宽、缩略图存放路径、缩略图生成方式
51 * @param string $srcImage
52 * @param int $toW
53 * @param int $toH
54 * @param string $method
55 * @param string $echotype
56 */
57 public function setThumb($srcImage = ‘‘, $toW = 0, $toH = 0, $method = ‘distortion‘){
58 $this->srcImage = $srcImage;
59 $imageName = explode(‘/‘, $this->srcImage);
60 $this->originName = $imageName[2];
61 //检查源文件是否存在
62 if(empty($srcImage) || filetype($srcImage) != ‘file‘){
63 $this->errorNum = 4;
64 $this->errorMess = $this->getError();
65 return false;
66 }
67 //检查文件上传路径
68 if ($this->echotype == ‘file‘){
69 if(!$this->checkImagePath()){
70 $this->errorMess = $this->getError();
71 return false;
72 }
73 }
74 $info = ‘‘;
75 $data = getimagesize($this->srcImage, $info);//获取图像大小
76 $this->srcW = $data[0];//宽
77 $this->srcH = $data[1];//高
78 //检查GD库
79 if(!$this->checkGD($data[2])){
80 $this->errorMess = $this->getError();
81 return false;
82 }
83 $this->setImageName();//设置缩略图名称
84 $toFile = $this->imagepath.$this->newImageName;//缩略图存放路径
85 $return = $this->createImageMethod($method, $toFile, $toW, $toH);
86 return $return;
87 }
88 /**
89 *
90 * 初始化缩略图生成方式
91 * prorate 按比例缩放
92 * distortion 扭曲型缩图
93 * cut 最小裁剪后的缩图
94 * backFill 背景填充图
95 * @param string $method
96 * @param string $toFile
97 * @param int $toW
98 * @param int $toH
99 */
100 private function createImageMethod($method, $toFile, $toW, $toH){
101 switch ($method){
102 case ‘prorate‘:
103 $return = $this->prorate($toFile, $toW, $toH);
104 break;
105 case ‘cut‘:
106 $return = $this->cut($toFile, $toW, $toH);
107 break;
108 case ‘backFill‘:
109 $return = $this->backFill($toFile, $toW, $toH);
110 break;
111 default:
112 $return = $this->distortion($toFile, $toW, $toH);
113 }
114 return $return;
115 }
116 //生成扭曲型缩图
117 function distortion($toFile=‘‘, $toW=0, $toH=0){
118 $cImg=$this->creatImage($this->im, $toW, $toH, 0, 0, 0, 0, $this->srcW, $this->srcH);
119 return $this->echoImage($cImg, $toFile);
120 imagedestroy($cImg);
121 }
122
123 //生成按比例缩放的缩图
124 function prorate($toFile, $toW, $toH){
125 $toWH = $toW / $toH;
126 $srcWH = $this->srcW / $this->srcH;
127 if($toWH <= $srcWH){
128 $ftoW = $toW;
129 $ftoH = $ftoW * ($this->srcH / $this->srcW);
130 }else{
131 $ftoH = $toH;
132 $ftoW = $ftoH * ($this->srcW / $this->srcH);
133 }
134 if($this->srcW > $toW || $this->srcH > $toH){
135 $cImg = $this->creatImage($this->im, $ftoW, $ftoH, 0, 0, 0, 0, $this->srcW, $this->srcH);
136 return $this->echoImage($cImg, $toFile);
137 imagedestroy($cImg);
138 }else{
139 $cImg = $this->creatImage($this->im, $this->srcW, $this->srcH, 0, 0, 0, 0, $this->srcW, $this->srcH);
140 return $this->echoImage($cImg, $toFile);
141 imagedestroy($cImg);
142 }
143 }
144
145 //生成最小裁剪后的缩图
146 private function cut($toFile, $toW, $toH){
147 $toWH = $toW/$toH;
148 $srcWH = $this->srcW / $this->srcH;
149 if($toWH <= $srcWH){
150 $ctoH = $toH;
151 $ctoW = $ctoH * ($this->srcW / $this->srcH);
152 }else{
153 $ctoW = $toW;
154 $ctoH = $ctoW * ($this->srcH / $this->srcW);
155 }
156 $allImg = $this->creatImage($this->im, $ctoW, $ctoH, 0, 0, 0, 0, $this->srcW, $this->srcH);
157 $cImg = $this->creatImage($allImg, $toW, $toH, 0, 0, ($ctoW-$toW) / 2, ($ctoH-$toH) / 2, $toW, $toH);
158 return $this->echoImage($cImg, $toFile);
159 imagedestroy($cImg);
160 imagedestroy($allImg);
161 }
162
163 //生成背景填充的缩图
164 private function backFill($toFile, $toW, $toH, $bk1=255, $bk2=255, $bk3=255){
165 $toWH = $toW / $toH;
166 $srcWH = $this->srcW / $this->srcH;
167 if($toWH <= $srcWH){
168 $ftoW = $toW;
169 $ftoH = $ftoW * ($this->srcH / $this->srcW);
170 }else{
171 $ftoH = $toH;
172 $ftoW = $ftoH*($this->srcW / $this->srcH);
173 }
174 if(function_exists("imagecreatetruecolor")){
175 @$cImg = imagecreatetruecolor($toW,$toH);
176 if(!$cImg){
177 $cImg = imagecreate($toW,$toH);
178 }
179 }else{
180 $cImg = imagecreate($toW,$toH);
181 }
182 $backcolor = imagecolorallocate($cImg, $bk1, $bk2, $bk3); //填充的背景颜色
183 imagefilledrectangle($cImg,0,0,$toW,$toH,$backcolor);
184 if($this->srcW > $toW || $this->srcH > $toH){
185 $proImg = $this->creatImage($this->im,$ftoW,$ftoH,0,0,0,0,$this->srcW,$this->srcH);
186 if($ftoW < $toW){
187 imagecopy($cImg, $proImg, ($toW - $ftoW) / 2, 0, 0, 0, $ftoW, $ftoH);
188 }else if($ftoH < $toH){
189 imagecopy($cImg, $proImg, 0, ($toH-$ftoH) / 2, 0, 0, $ftoW, $ftoH);
190 }else{
191 imagecopy($cImg, $proImg, 0, 0, 0, 0, $ftoW, $ftoH);
192 }
193 }else{
194 imagecopymerge($cImg, $this->im, ($toW - $ftoW) / 2,($toH - $ftoH) / 2, 0, 0, $ftoW, $ftoH, 100);
195 }
196 return $this->echoImage($cImg, $toFile);
197 imagedestroy($cImg);
198 }
199 //创建图像
200 private function creatImage($img, $creatW, $creatH, $dstX, $dstY, $srcX, $srcY, $srcImgW, $srcImgH){
201 if(function_exists("imagecreatetruecolor")){
202 @$creatImg = imagecreatetruecolor($creatW, $creatH);
203 if($creatImg){
204 imagecopyresampled($creatImg, $img, $dstX, $dstY, $srcX, $srcY, $creatW, $creatH, $srcImgW, $srcImgH);
205 }else{
206 $creatImg=imagecreate($creatW,$creatH);
207 imagecopyresized($creatImg, $img, $dstX, $dstY, $srcX, $srcY, $creatW, $creatH, $srcImgW, $srcImgH);
208 }
209 }else{
210 $creatImg=imagecreate($creatW, $creatH);
211 imagecopyresized($creatImg, $img, $dstX, $dstY, $srcX, $srcY, $creatW, $creatH, $srcImgW, $srcImgH);
212 }
213 return $creatImg;
214 }
215
216 //输出图片,link---只输出,不保存文件。file--保存为文件
217 function echoImage($img, $toFile){
218 switch($this->echotype){
219 case ‘link‘:
220 if(function_exists(‘imagejpeg‘))
221 return imagejpeg($img);
222 else
223 return imagepng($img);
224 break;
225 case ‘file‘:
226 if(function_exists(‘imagejpeg‘))
227 return imagejpeg($img,$toFile);
228 else
229 return imagepng($img,$toFile);
230 break;
231 }
232 }
233 /**
234 *
235 * 设置随机文件名称
236 * @access private
237 * @return string
238 */
239 private function setRandName(){
240 $fileName = date("YmdHis").rand(100,999);
241 return $fileName.‘.‘.$this->imageType;
242 }
243 private function setImageName(){
244 if ($this->imagepre != ‘‘){
245 $this->newImageName = $this->imagepre.‘_‘.$this->setRandName();
246 }else {
247 $this->newImageName = $this->setRandName();
248 }
249 }
250 /**
251 *
252 * 用来检查文件上传路径
253 * @access private
254 * @return bool
255 */
256 private function checkImagePath(){
257 if(empty($this->imagepath)) {
258 $this->errorNum = -2;
259 return false;
260 }
261
262 if(!file_exists($this->imagepath) || !is_writable($this->imagepath)){
263 if(!@mkdir($this->imagepath, 0755)){
264 $this->errorNum = -1;
265 return false;
266 }
267 }
268 return true;
269 }
270 private function checkGD($imageType){
271 switch ($imageType){
272 case 1:
273 if(!function_exists("imagecreatefromgif")){
274 $this->errorNum = 1;
275 return false;
276 }
277 $this->imageType = ‘gif‘;
278 $this->im = imagecreatefromgif($this->srcImage);
279 break;
280 case 2:
281 if(!function_exists("imagecreatefromjpeg")){
282 $this->errorNum = 2;
283 return false;
284 }
285 $this->imageType = ‘jpg‘;
286 $this->im = imagecreatefromjpeg($this->srcImage);
287 break;
288 case 3:
289 if(!function_exists("imagecreatefrompng")){
290 $this->errorNum = 3;
291 return false;
292 }
293 $this->imageType = ‘png‘;
294 $this->im = imagecreatefrompng($this->srcImage);
295 break;
296 default:
297 $this->errorNum = 0;
298 return false;
299 }
300 return true;
301 }
302 /**
303 *
304 * 用于获取上传后缩略图片的文件名
305 * @access public
306 * @return string
307 */
308 public function getNewImageName(){
309 return $this->newImageName;
310 }
311
312 /**
313 *
314 * 获取上传错误信息
315 * @access private
316 * @return string
317 */
318 private function getError(){
319 $str=‘生成缩略图<font color="red">‘.$this->originName.‘</font>时出错:‘;
320
321 switch($this->errorNum){
322 case 4: $str .= ‘没有找到需要缩略的图片‘;
323 break;
324 case 3: $str .= ‘你的GD库不能使用png格式的图片,请使用其它格式的图片!‘;
325 break;
326 case 2: $str .= ‘你的GD库不能使用jpeg格式的图片,请使用其它格式的图片!‘;
327 break;
328 case 1: $str .= ‘你的GD库不能使用GIF格式的图片,请使用Jpeg或PNG格式!‘;
329 break;
330 case -1: $str .= ‘建立存放缩略图目录失败,请重新指定缩略图目录‘;
331 break;
332 case -2: $str .= ‘必须指定缩略图的路径‘;
333 break;
334 case -3: $str .= ‘初始化参数出错‘;
335 break;
336 default: $str .= ‘末知错误‘;
337 }
338
339 return $str.‘<br>‘;
340 }
341 public function getErrorMsg() {
342 return $this->errorMess;
343 }
344 }