龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > web编程 > php编程 >

基于GD库的缩略图图 生成类

时间:2014-07-22 14:51来源: 作者: 点击:
分享到:
div ?php /div div /** /div div * 图片缩略类 /div div * @author foyon /div div * /div div */ /div div br / /div div class ImgThumb{ /div div span style=white-space:pre; /span span style=white-space:pre; /span /div div span style=white-sp
<?php
 /**
  * 图片缩略类
  * @author foyon
  *
  */

class ImgThumb{
 
  /**
  * 生成的大小完全符合要求,但是会截图
  * @param unknown_type $src_file
  * @param unknown_type $dst_file
  * @param unknown_type $new_width
  * @param unknown_type $new_height
  */
   function ImageResize($src_file, $dst_file , $new_width , $new_height) {
   $new_width= intval($new_width);
   $new_height=intval($new_height);
  
   if($new_width <1 || $new_height <1) {
   echo "params width or height error !";
   exit();
   }
    
   $src_img=imagecreatefromstring($src_file);
   $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);
   imagejpeg($new_img, $dst_file,100);
   ob_clean();
   header("Content-type: image/jpeg");
  
   Imagejpeg($new_img);
  
  
   } // 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);
   imagejpeg($new_img, $dst_file,100);
   ob_clean();
   header("Content-type: image/jpeg");
  
   Imagejpeg($new_img);
   }
   }
  
   /**
   * 图片处理函数
   * @param unknown_type $img 传入的原图像流(MONGO二进制)
   * @param unknown_type $dst_file 转换后的图像存储路径
   * @param unknown_type $toW 生成的宽度
   * @param unknown_type $toH 生成的高度
   */
   public function ImageChange($img, $dst_file, $toW='', $toH=''){
  
  $im = imagecreatefromstring($img);
  $srcW=ImageSX($im);
  $srcH=ImageSY($im);

 
  if(!$toW){
  $toW = $srcW;
  }
 
  if(!$toH){
  $toH = $srcH;
  }
 
  $toWH=$toW/$toH; //生成宽高比
  $srcWH=$srcW/$srcH; //原图宽高比
 
  if($toWH <= $srcWH){
  $ftoW=$toW;
  $ftoH=$ftoW*($srcH/$srcW);
  }else{
  $ftoH=$toH;
  $ftoW=$ftoH*($srcW/$srcH);
  }
     
   if(function_exists("imagecreatetruecolor")){
   @$ni = ImageCreateTrueColor($ftoW,$ftoH);
   imagealphablending($ni,false);
   imagesavealpha($ni,true);
   if($ni){ 
   ImageCopyResampled($ni,$im,0,0,0,0,$ftoW,$ftoH,$srcW,$srcH);
   }else{
   $ni=ImageCreate($ftoW,$ftoH);
   ImageCopyResized($ni,$im,0,0,0,0,$ftoW,$ftoH,$srcW,$srcH);
   }
  
   }else{
   $ni=ImageCreate($ftoW,$ftoH);
   ImageCopyResized($ni,$im,0,0,0,0,$ftoW,$ftoH,$srcW,$srcH);
   }
   
  imagejpeg($ni, $dst_file,100);
  ob_clean();  
  header("Content-type: image/jpeg");  
  imagejpeg($ni);  
   }
  
}


?>

<?php
 /**
  * 图片缩略类
  * @author foyon
  *
  */

class ImgThumb{
	  	
	  	/**
	  	 * 生成的大小完全符合要求,但是会截图
	  	 * @param unknown_type $src_file
	  	 * @param unknown_type $dst_file
	  	 * @param unknown_type $new_width
	  	 * @param unknown_type $new_height
	  	 */
  		function ImageResize($src_file, $dst_file , $new_width , $new_height) {
  			$new_width= intval($new_width);
  			$new_height=intval($new_height);
  			
  			if($new_width <1 || $new_height <1) {
  				echo "params width or height error !";
  				exit();
  			}
  			  			
  			$src_img=imagecreatefromstring($src_file);
  			$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);
  				imagejpeg($new_img, $dst_file,100);
  				ob_clean();
  				header("Content-type: image/jpeg");	
  									
  				Imagejpeg($new_img);
  				
  				
  			} // 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);
  				imagejpeg($new_img, $dst_file,100);
  				ob_clean();
  				header("Content-type: image/jpeg");
  					
  				Imagejpeg($new_img);
  			}
  		}
  		
  		/**
  		 * 图片处理函数
  		 * @param unknown_type $img 传入的原图像流(MONGO二进制)
  		 * @param unknown_type $dst_file 转换后的图像存储路径
  		 * @param unknown_type $toW 生成的宽度
  		 * @param unknown_type $toH 生成的高度
  		 */
  		public function ImageChange($img, $dst_file, $toW='', $toH=''){
  			
	  		$im = imagecreatefromstring($img);
	  		$srcW=ImageSX($im);
	  		$srcH=ImageSY($im);

	  		
	  		if(!$toW){
	  			$toW = $srcW;
	  		}
	  		
	  		if(!$toH){
	  			$toH = $srcH;
	  		}
	  		
	  		$toWH=$toW/$toH; //生成宽高比
	  		$srcWH=$srcW/$srcH; //原图宽高比
	  		
	  		if($toWH <= $srcWH){
	  			$ftoW=$toW;
	  			$ftoH=$ftoW*($srcH/$srcW);
	  		}else{
	  			$ftoH=$toH;
	  			$ftoW=$ftoH*($srcW/$srcH);
	  		}
	  			  			  		
  			if(function_exists("imagecreatetruecolor")){
  				@$ni = ImageCreateTrueColor($ftoW,$ftoH);
  				imagealphablending($ni,false);
  				imagesavealpha($ni,true);
  				if($ni){ 
  					ImageCopyResampled($ni,$im,0,0,0,0,$ftoW,$ftoH,$srcW,$srcH);
  				}else{
  					$ni=ImageCreate($ftoW,$ftoH);
  					ImageCopyResized($ni,$im,0,0,0,0,$ftoW,$ftoH,$srcW,$srcH);
  				}
  			
  			}else{
  				$ni=ImageCreate($ftoW,$ftoH);
  				ImageCopyResized($ni,$im,0,0,0,0,$ftoW,$ftoH,$srcW,$srcH);
  			}
	  					  		
	  		imagejpeg($ni, $dst_file,100);
	  		ob_clean();	  		
	  		header("Content-type: image/jpeg");	  		
	  		imagejpeg($ni);	  		
  		}
  	
}


?>
精彩图集

赞助商链接