核心代码如下

public function getImage(){

	// create instance
	$basePath = base_path('public/');
	$md5 = 'b8c3bf0b10a81c5b6a98c527868a0000';

	$sub1 = substr($md5, 0, 1);
	$sub2 = substr($md5, 1, 2);
	$subPath = sprintf("image/%s/%s/%s%s.jpg", $sub1, $sub2, $md5, '300x300');
	$sourcePath = sprintf("image/%s/%s/%s.jpg", $sub1, $sub2, $md5);


	//截成100x80的缩略图
	//$image = $this->getCropper($basePath.$sourcePath,$basePath.$subPath, 300, 300);
	$image = $this->getCrops($basePath.$sourcePath,$basePath.$subPath, 300, 300);


}

//生成缩略图
function getCropper($source_path,$NewImagePath, $target_width, $target_height)
{
	$source_info   = getimagesize($source_path);
	$source_width  = $source_info[0];
	$source_height = $source_info[1];
	$source_mime   = $source_info['mime'];
	$source_ratio  = $source_height / $source_width;
	$target_ratio  = $target_height / $target_width;

	// 源图过高
	if ($source_ratio > $target_ratio)
	{
		$cropped_width  = $source_width;
		$cropped_height = $source_width * $target_ratio;
		$source_x = 0;
		$source_y = ($source_height - $cropped_height) / 2;
	}
	// 源图过宽
	elseif ($source_ratio < $target_ratio)
	{
		$cropped_width  = $source_height / $target_ratio;
		$cropped_height = $source_height;
		$source_x = ($source_width - $cropped_width) / 2;
		$source_y = 0;
	}
	// 源图适中
	else
	{
		$cropped_width  = $source_width;
		$cropped_height = $source_height;
		$source_x = 0;
		$source_y = 0;
	}

	switch ($source_mime)
	{
		case 'image/gif':
			$source_image = imagecreatefromgif($source_path);
			break;

		case 'image/jpeg':
			$source_image = imagecreatefromjpeg($source_path);
			break;

		case 'image/png':
			$source_image = imagecreatefrompng($source_path);
			break;

		default:
			return false;
			break;
	}

	$target_image  = imagecreatetruecolor($target_width, $target_height);
	$cropped_image = imagecreatetruecolor($cropped_width, $cropped_height);

	// 图片裁剪
	imagecopy($cropped_image, $source_image, 0, 0, $source_x, $source_y, $cropped_width, $cropped_height);
	// 图片缩放
	imagecopyresampled($target_image, $cropped_image, 0, 0, 0, 0, $target_width, $target_height, $cropped_width, $cropped_height);


	header('Content-Type: image/jpeg');
	imagejpeg($target_image,$NewImagePath,100);
	imagedestroy($source_image);
	imagedestroy($target_image);
	imagedestroy($cropped_image);
}


//生成缩略图,填充白边
function getCrops($src_path,$NewImagePath,$width,$height){

	//源图对象
	$src_image = imagecreatefromstring(file_get_contents($src_path));
	$source_info   = getimagesize($src_path);
	$source_mime   = $source_info['mime'];
	$src_width = imagesx($src_image);
	$src_height = imagesy($src_image);

	switch ($source_mime)
	{
		case 'image/gif':
			$src_image = imagecreatefromgif($src_path);
			break;

		case 'image/jpeg':
			$src_image = imagecreatefromjpeg($src_path);
			break;

		case 'image/png':
			$src_image = imagecreatefrompng($src_path);
			break;

		default:
			return false;
			break;
	}


	//生成等比例的缩略图
	//$tmp_image_width = 0;
	//$tmp_image_height = 0;
	if ($src_width / $src_height >= $width / $height) {

		$tmp_image_width = $width;
		$tmp_image_height = round($tmp_image_width * $src_height / $src_width);

	} else {

		$tmp_image_height = $height;
		$tmp_image_width = round($tmp_image_height * $src_width / $src_height);
	}

	$tmpImage = imagecreatetruecolor($tmp_image_width, $tmp_image_height);
	imagecopyresampled($tmpImage, $src_image, 0, 0, 0, 0, $tmp_image_width, $tmp_image_height, $src_width, $src_height);

	//添加白边
	$final_image = imagecreatetruecolor($width, $height);
	$color = imagecolorallocate($final_image, 255, 255, 255);
	imagefill($final_image, 0, 0, $color);
	$x = round(($width - $tmp_image_width) / 2);
	$y = round(($height - $tmp_image_height) / 2);
	imagecopy($final_image, $tmpImage, $x, $y, 0, 0, $tmp_image_width, $tmp_image_height);

	//输出图片
	header('Content-Type: image/jpeg');
	imagejpeg($final_image,$NewImagePath,100);
	imagedestroy($src_image);
	imagedestroy($final_image);


}

发表评论

电子邮件地址不会被公开。 必填项已用*标注