• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

PHP图片裁剪、无损调整图片大小

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
/*
 *exif_imagetype -- 判断一个图像的类型
 *功能说明:函数功能是把一个图像裁剪为任意大小的图像,并保持图像不变形
 *参数说明:输入 需要处理图片的 文件名,生成新图片的保存文件名,生成新图片的宽,生成新图片的高
 */
 
// 获得任意大小图像,不足地方拉伸,不产生变形,不留下空白
function image_resize($src_file, $dst_file, $new_width, $new_height)
{
	$new_width = intval($new_width);
	
	$new_height = intval($new_width);
	
	if ($new_width < 1 || $new_height < 1)
	{
		echo "params width or height error !";
		exit();
	}
	
	if (!file_exists($src_file))
	{
		echo $src_file . " is not exists !";
		exit();
	}
	
	// 图像类型
	$type = exif_imagetype($src_file);
	
	$support_type = array(IMAGETYPE_JPEG, IMAGETYPE_PNG, IMAGETYPE_GIF);
	
	if (!in_array($type, $support_type, true))
	{
		
		echo "this type of image does not support! only support jpg , gif or png";
		exit();
	}
	
	//Load image
	
	switch($type)
	{
		case IMAGETYPE_JPEG :
			
			$src_img = imagecreatefromjpeg($src_file);
			
			break;
			
		case IMAGETYPE_PNG :
			
			$src_img = imagecreatefrompng($src_file);
			
			break;
			
		case IMAGETYPE_GIF :
			
			$src_img = imagecreatefromgif($src_file);
			
			break;
			
		default :
			echo "Load image error!";
			
			exit();
	}
	
	$w = imagesx($src_img);
	
	$h = imagesy($src_img);
	
	$ratio_w = 1.0 * $new_width / $w;
	
	$ratio_h = 1.0 * $new_height / $h;
	
	$ratio = 1.0;
	
	// 生成的图像的高宽比原来的都小,或都大 ,原则是 取大比例放大,取大比例缩小(缩小的比例就比较小了)
	
	if (($ratio_w < 1 && $ratio_h < 1) || ($ratio_w > 1 && $ratio_h > 1))
	{
		
		if ($ratio_w < $ratio_h) {
			
			$ratio = $ratio_h;
			
			// 情况一,宽度的比例比高度方向的小,按照高度的比例标准来裁剪或放大
			
		} else {
			
			$ratio = $ratio_w;
			
		}
		
		// 定义一个中间的临时图像,该图像的宽高比 正好满足目标要求
		
		$inter_w = (int)($new_width / $ratio);
		
		$inter_h = (int)($new_height / $ratio);
		
		$inter_img = imagecreatetruecolor($inter_w, $inter_h);
		
		//var_dump($inter_img);
		
		imagecopy($inter_img, $src_img, 0, 0, 0, 0, $inter_w, $inter_h);
		
		// 生成一个以最大边长度为大小的是目标图像$ratio比例的临时图像
		// 定义一个新的图像
		
		$new_img = imagecreatetruecolor($new_width, $new_height);
		
		//var_dump($new_img);exit();
		imagecopyresampled($new_img, $inter_img, 0, 0, 0, 0, $new_width, $new_height, $inter_w, $inter_h);
		
		switch($type)
		{
			case IMAGETYPE_JPEG :
				
				// 存储图像
				imagejpeg($new_img, $dst_file, 100);
				
				break;
				
			case IMAGETYPE_PNG :
				
				imagepng($new_img, $dst_file, 100);
				
				break;
				
			case IMAGETYPE_GIF :
				
				imagegif($new_img, $dst_file, 100);
				
				break;
				
			default :
				
				break;
		}
		
	}// end if 1
	
	// 2 目标图像 的一个边大于原图,一个边小于原图 ,先放大平普图像,然后裁剪
	
	// =if( ($ratio_w < 1 && $ratio_h > 1) || ($ratio_w >1 && $ratio_h <1) )
	
	else {
		
		$ratio = $ratio_h > $ratio_w ? $ratio_h : $ratio_w;
		
		//取比例大的那个值
		
		// 定义一个中间的大图像,该图像的高或宽和目标图像相等,然后对原图放大
		
		$inter_w = (int)($w * $ratio);
		
		$inter_h = (int)($h * $ratio);
		
		$inter_img = imagecreatetruecolor($inter_w, $inter_h);
		
		//将原图缩放比例后裁剪
		
		imagecopyresampled($inter_img, $src_img, 0, 0, 0, 0, $inter_w, $inter_h, $w, $h);
		
		// 定义一个新的图像
		
		$new_img = imagecreatetruecolor($new_width, $new_height);
		
		imagecopy($new_img, $inter_img, 0, 0, 0, 0, $new_width, $new_height);
		
		switch($type)
		{
			case IMAGETYPE_JPEG :
				
				// 存储图像
				imagejpeg($new_img, $dst_file, 100);
				
				break;
				
			case IMAGETYPE_PNG :
				
				imagepng($new_img, $dst_file, 100);
				break;
				
			case IMAGETYPE_GIF :
				
				imagegif($new_img, $dst_file, 100);
				
				break;
				
			default :
				
				break;
		}
		
	}// if3
	
}// end function

//输出新图片

image_resize('test.jpg', 'demo.jpg', '1200px', '1200px');

博主留言:请尊重他人劳动成果,转载请注明文章出处。

当前文章链接:http://www.cnblogs.com/hollow/articles/6370540.html


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
php如何实现页面回退的两种方法发布时间:2022-07-10
下一篇:
php中iconv、mb_convert_encoding函数字符编码转换详解发布时间:2022-07-10
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap