网上流行着各种PHP生成缩略图的函数、类,但是仔细一分析,总会有那么一点问题,最常见的就是在缩略图算法上。其实就是将一个矩形装入另一个矩形的计算方法,这种计算方法似乎在中学时期都已经用的熟透,但是一写到程序里面,则总是会出问题。我们将网上流行的一种生成缩略图的一个函数进行了分析,整理,并对其生成缩略图的质量进行了改进(需要GD2支持)。
// 源文件格式:gif,jpg,jpe,jpeg,png
// 目的文件格式:jpg
// 参数说明:
// $srcFile 源文件
// $dstFile 目标文件
// $dstW 目标图象宽度
// $dstH 目标图象高度
function makethumb($srcFile,$dstFile,$dstW,$dstH) {
$data = GetImageSize($srcFile,$info);
switch ($data[2]){
case 1:
$im = @ImageCreateFromGIF($srcFile);
break;
case 2:
$im = @imagecreatefromjpeg($srcFile);
break;
case 3:
$im = @ImageCreateFromPNG($srcFile);
break;
}
$srcW=ImageSX($im);
$srcH=ImageSY($im);
$dstX=0;
$dstY=0;
/*
if ($srcW*$dstH>$srcH*$dstW) {
$fdstH=round($srcH*$dstW/$srcW);
$dstY=floor(($dstH-$fdstH)/2);
$fdstW=$dstW;
}else{
$fdstW=round($srcW*$dstH/$srcH);
$dstX=floor(($dstW-$fdstW)/2);
$fdstH=$dstH;
}
*/
$bili=$srcW/$srcH;
if($srcW * $srcH >= $dstW * $dstH){
if($srcW >$srcH){
$fdstW=$dstW;
$fdstH=ceil($fdstW / $bili);
}else{
$fdstH=$dstH;
$fdstW=ceil($fdstH * $bili);
}
}else{
if($srcW <= $dstW && $srcH <= $dstH){
$fdstW=$srcW;
$fdstH=$srcH;
}elseif($srcW >= $dstW){
$fdstW=$dstW;
$fdstH=ceil($fdstW / $bili);
}else{
$fdstH=$dstH;
$fdstW=ceil($fdstH * $bili);
}
}
//echo $fdstW,':',$fdstH;
//$ni=imagecreatetruecolor($dstW,$dstH);
$ni=imagecreatetruecolor($fdstW,$fdstH);
$dstX=($dstX<0)?0:$dstX;
$dstY=($dstX<0)?0:$dstY;
$dstX=($dstX>($dstW/2))?floor($dstW/2):$dstX;
$dstY=($dstY>($dstH/2))?floor($dstH/s):$dstY;
$black = ImageColorAllocate($ni, 255,255,255);//填充的背景色:黑色
imagefilledrectangle($ni,0,0,$dstW,$dstH,$black);
//imagecopyresampled($ni,$im,$dstX,$dstY,0,0,$fdstW,$fdstH,$srcW,$srcH);
imagecopyresampled($ni,$im,0,0,0,0,$fdstW,$fdstH,$srcW,$srcH);
ImageJpeg($ni,$dstFile);//图片直接输出二个参数去掉用header()mine类型
imagedestroy($im);
imagedestroy($ni);
}