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
|