万擎电子商务常用库之--PHP缩略图函数

发布日期:2008-03-30    浏览次数:

     网上流行着各种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);
}

相关内容:

正在拉取内容......