GD生成缩略图函数

根据传入的宽高,先根据值大的缩放图片(根据宽或者高等比缩放),再截取图片,不足部分,留白显示,这样就保证了图片不会因为缩放而变形,特别是针对长方形的图片

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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值