根据传入的宽高,先根据值大的缩放图片(根据宽或者高等比缩放),再截取图片,不足部分,留白显示,这样就保证了图片不会因为缩放而变形,特别是针对长方形的图片
createThumbGD('t.jpg','t1.jpg',100,120);
function createThumbGD($src,$moveto,$outputWidth,$outputHeight){
$srcImageInfo=getimagesize($src);
$srcImageWidth=$srcImageInfo[0];
$srcImageHeight=$srcImageInfo[1];
$srcImageMime=$srcImageInfo['mime'];
$img=imagecreatetruecolor($srcImageWidth,$srcImageHeight);
$white=imagecolorallocate($img,255,255,255);//白色
imagefill($img, 0, 0, $white);
switch($srcImageMime) {
case 'image/jpeg':
$imagecreatefromfunc = function_exists('imagecreatefromjpeg') ? 'imagecreatefromjpeg' : '';
$imagefunc = function_exists('imagejpeg') ? 'imagejpeg' : '';
break;
case 'image/gif':
$imagecreatefromfunc = function_exists('imagecreatefromgif') ? 'imagecreatefromgif' : '';
$imagefunc = function_exists('imagegif') ? 'imagegif' : '';
break;
case 'image/png':
$imagecreatefromfunc = function_exists('imagecreatefrompng') ? 'imagecreatefrompng' : '';
$imagefunc = function_exists('imagepng') ? 'imagepng' : '';
break;
}
if($imagecreatefromfunc=='' || $imagefunc==''){
return false;
}
$srcImage=$imagecreatefromfunc($src);
$returnPic = imagecreatetruecolor($outputWidth, $outputHeight);
//returnPic-输出图,img-拷贝的原图,dst_x-目标X坐标,dst_y-目标Y坐标,src_x-源X坐标,src_y-源Y坐标,dst_w-目标宽,dst_h-目标高,src_w-源宽,src_h-源高
$dst_x=$dst_y=$src_x=$src_y=$src_w=$src_h=0;
$src_w=$srcImageWidth;
$src_h=$srcImageHeight;
//计算目标图的宽高
$x_ratio = $outputWidth / $srcImageWidth;
$y_ratio = $outputHeight / $srcImageHeight;
if(($x_ratio * $srcImageHeight) < $outputHeight) {
$dst_h = ceil($x_ratio * $srcImageHeight);
$dst_w = $outputWidth;
} else {
$dst_w = ceil($y_ratio * $srcImageWidth);
$dst_h = $outputHeight;
}
$srcWH_ratio=$src_h / $src_w;
$output_ratio=$outputHeight / $outputWidth;
//宽高比例大于目标的比例,截取中间部分
if($srcWH_ratio>$output_ratio){
$src_h=$src_w * $output_ratio;
if($src_w>$outputWidth){
$dst_w=$outputWidth;
}else{
$dst_w=$src_w;
}
$src_y=($srcImageHeight-$src_h) / 2;
}elseif($srcWH_ratio<$output_ratio){
$src_w=$src_h / $output_ratio;
if($src_h>$outputHeight){
$dst_h=$outputHeight;
}else{
$dst_h=$src_h;
}
$src_x=($srcImageWidth-$src_w) / 2;
}
//宽高小于目标图,两边留白
if($dst_w<$outputWidth){
$dst_x=($outputWidth-$dst_w) / 2;
}
if($dst_h<$outputHeight){
$dst_y=($outputHeight-$dst_h) / 2;
}
imagecopy($img,$srcImage,0, 0, 0, 0, $srcImageWidth, $srcImageHeight);
imagefill($returnPic, 0, 0, $white);
imagecopyresampled($returnPic, $img ,$dst_x ,$dst_y ,$src_x ,$src_y, $dst_w, $dst_h, $src_w, $src_h);
$imagefunc($returnPic,$moveto);
imagedestroy($returnPic);
imagedestroy($img);
clearstatcache();
return true;
}