1网上流行着各种PHP生成缩略图的函数、类,但是仔细一分析,总会有那么一点问题,最常见的就是在缩略图算法上。其实就是将一个矩形装入另一个矩形的计算方法,这种计算方法似乎在中学时期都已经用的熟透,但是一写到程序里面,则总是会出问题。我们将网上流行的一种生成缩略图的一个函数进行了分析,整理,并对其生成缩略图的质量进行了改进(需要GD2支持)。
 2
 3// 源文件格式:gif,jpg,jpe,jpeg,png 
 4// 目的文件格式:jpg 
 5// 参数说明: 
 6// $srcFile 源文件 
 7// $dstFile 目标文件 
 8// $dstW 目标图象宽度 
 9// $dstH 目标图象高度 
10function makethumb($srcFile,$dstFile,$dstW,$dstH) { 
11 $data = GetImageSize($srcFile,$info); 
12 switch ($data[2]){ 
13  case 1: 
14   $im = @ImageCreateFromGIF($srcFile); 
15   break
16  case 2: 
17   $im = @imagecreatefromjpeg($srcFile); 
18   break
19 case 3: 
20   $im = @ImageCreateFromPNG($srcFile); 
21   break
22 } 
23 $srcW=ImageSX($im); 
24 $srcH=ImageSY($im); 
25 $dstX=0
26 $dstY=0
27/*
28 if ($srcW*$dstH>$srcH*$dstW) { 
29  $fdstH=round($srcH*$dstW/$srcW); 
30  $dstY=floor(($dstH-$fdstH)/2); 
31  $fdstW=$dstW; 
32 }else{ 
33  $fdstW=round($srcW*$dstH/$srcH); 
34  $dstX=floor(($dstW-$fdstW)/2); 
35  $fdstH=$dstH; 
36 } 
37*/
38 $bili=$srcW/$srcH;
39 if($srcW * $srcH >= $dstW * $dstH){
40  if($srcW >$srcH){
41   $fdstW=$dstW;
42   $fdstH=ceil($fdstW / $bili);
43  }else{
44   $fdstH=$dstH;
45   $fdstW=ceil($fdstH * $bili);
46  }
47 }else{
48  if($srcW <= $dstW && $srcH <= $dstH){
49   $fdstW=$srcW;
50   $fdstH=$srcH;
51  }elseif($srcW >= $dstW){
52   $fdstW=$dstW;
53   $fdstH=ceil($fdstW / $bili);
54  }else{
55   $fdstH=$dstH;
56   $fdstW=ceil($fdstH * $bili);
57  }
58 }
59 //echo $fdstW,':',$fdstH;
60 //$ni=imagecreatetruecolor($dstW,$dstH); 
61 $ni=imagecreatetruecolor($fdstW,$fdstH); 
62 $dstX=($dstX<0)?0:$dstX
63 $dstY=($dstX<0)?0:$dstY
64 $dstX=($dstX>($dstW/2))?floor($dstW/2):$dstX
65 $dstY=($dstY>($dstH/2))?floor($dstH/s):$dstY
66
67 $black = ImageColorAllocate($ni, 255,255,255);//填充的背景色:黑色 
68 imagefilledrectangle($ni,0,0,$dstW,$dstH,$black); 
69 //imagecopyresampled($ni,$im,$dstX,$dstY,0,0,$fdstW,$fdstH,$srcW,$srcH); 
70 imagecopyresampled($ni,$im,0,0,0,0,$fdstW,$fdstH,$srcW,$srcH); 
71 ImageJpeg($ni,$dstFile);//图片直接输出二个参数去掉用header()mine类型 
72 imagedestroy($im); 
73 imagedestroy($ni); 
74}
75
76