当前位置:首页 > PHP教程 > php图像处理 > 列表

PHP实现图片裁剪与缩放的几种方法

发布:smiling 来源: PHP粉丝网  添加日期:2014-06-23 08:40:40 浏览: 评论:0 

图片指定大小然后由php相关函数来实现图片裁剪功能,前段的js效果在这里就不介绍了,大家可以到网上找有很多这类代码,我只整理了php操作部份.

方法一,代码如下,图片裁剪缩放函数,支持方位裁剪和自定义坐标裁剪.

  1. /** 
  2.      * 图片裁剪函数,支持指定定点裁剪和方位裁剪两种裁剪模式 
  3.      * @param <string>  $src_file       原图片路径 
  4.      * @param <int>     $new_width      裁剪后图片宽度(当宽度超过原图片宽度时,去原图片宽度) 
  5.      * @param <int>     $new_height     裁剪后图片高度(当宽度超过原图片宽度时,去原图片高度) 
  6.      * @param <int>     $type           裁剪方式,1-方位模式裁剪;0-定点模式裁剪。 
  7.      * @param <int>     $pos            方位模式裁剪时的起始方位(当选定点模式裁剪时,此参数不起作用) 
  8.      *                                      1为顶端居左,2为顶端居中,3为顶端居右;  
  9.      *                                      4为中部居左,5为中部居中,6为中部居右;  
  10.      *                                      7为底端居左,8为底端居中,9为底端居右; 
  11.      * @param <int>     $start_x        起始位置X (当选定方位模式裁剪时,此参数不起作用) 
  12.      * @param <int>     $start_y        起始位置Y(当选定方位模式裁剪时,此参数不起作用) 
  13.      * @return <string>                 裁剪图片存储路径 
  14.      */ 
  15.     function thumb($src_file$new_width$new_height$type = 1, $pos = 5, $start_x = 0, $start_y = 0) { 
  16.         $pathinfo = pathinfo($src_file); 
  17.         $dst_file = $pathinfo['dirname'] . '/' . $pathinfo['filename'] .'_'$new_width . 'x' . $new_height . '.' . $pathinfo['extension']; 
  18.         if (!file_exists($dst_file)) { 
  19.             if ($new_width < 1 || $new_height < 1) { 
  20.                 echo "params width or height error !"
  21.                 exit(); 
  22.             } 
  23.             if (!file_exists($src_file)) { 
  24.                 echo $src_file . " is not exists !"
  25.                 exit(); 
  26.             } 
  27.             // 图像类型 
  28.             $img_type = exif_imagetype($src_file); 
  29.             $support_type = array(IMAGETYPE_JPEG, IMAGETYPE_PNG, IMAGETYPE_GIF); 
  30.             if (!in_array($img_type$support_type, true)) { 
  31.                 echo "只支持jpg、png、gif格式图片裁剪"
  32.                 exit(); 
  33.             } 
  34.             /* 载入图像 */ 
  35.             switch ($img_type) { 
  36.                 case IMAGETYPE_JPEG : 
  37.                     $src_img = imagecreatefromjpeg($src_file); 
  38.                     break
  39.                 case IMAGETYPE_PNG : 
  40.                     $src_img = imagecreatefrompng($src_file); 
  41.                     break
  42.                 case IMAGETYPE_GIF : 
  43.                     $src_img = imagecreatefromgif($src_file); 
  44.                     break
  45.                 default
  46.                 echo "载入图像错误!"
  47.                 exit(); 
  48.             } 
  49.             /* 获取源图片的宽度和高度 */ 
  50.             $src_width = imagesx($src_img); 
  51.             $src_height = imagesy($src_img); 
  52.             /* 计算剪切图片的宽度和高度 */ 
  53.             $mid_width = ($src_width < $new_width) ? $src_width : $new_width
  54.             $mid_height = ($src_height < $new_height) ? $src_height : $new_height
  55.             /* 初始化源图片剪切裁剪的起始位置坐标 */ 
  56.             switch ($pos * $type) { 
  57.                 case 1://1为顶端居左  
  58.                     $start_x = 0; 
  59.                     $start_y = 0; 
  60.                     break
  61.                 case 2://2为顶端居中  
  62.                     $start_x = ($src_width - $mid_width) / 2; 
  63.                     $start_y = 0; 
  64.                     break
  65.                 case 3://3为顶端居右  
  66.                     $start_x = $src_width - $mid_width
  67.                     $start_y = 0; 
  68.                     break
  69.                 case 4://4为中部居左  
  70.                     $start_x = 0; 
  71.                     $start_y = ($src_height - $mid_height) / 2; 
  72.                     break
  73.                 case 5://5为中部居中  
  74.                     $start_x = ($src_width - $mid_width) / 2; 
  75.                     $start_y = ($src_height - $mid_height) / 2; 
  76.                     break
  77.                 case 6://6为中部居右  
  78.                     $start_x = $src_width - $mid_width
  79.                     $start_y = ($src_height - $mid_height) / 2; 
  80.                     break
  81.                 case 7://7为底端居左  
  82.                     $start_x = 0; 
  83.                     $start_y = $src_height - $mid_height
  84.                     break
  85.                 case 8://8为底端居中  
  86.                     $start_x = ($src_width - $mid_width) / 2; 
  87.                     $start_y = $src_height - $mid_height
  88.                     break
  89.                 case 9://9为底端居右  
  90.                     $start_x = $src_width - $mid_width
  91.                    $start_y = $src_height - $mid_height
  92.                     break
  93.                 default://随机  
  94.                     break
  95.             } 
  96.             // 为剪切图像创建背景画板 
  97.             $mid_img = imagecreatetruecolor($mid_width$mid_height); 
  98.             //拷贝剪切的图像数据到画板,生成剪切图像 
  99.             imagecopy($mid_img$src_img, 0, 0, $start_x$start_y$mid_width$mid_height); 
  100.             // 为裁剪图像创建背景画板 
  101.             $new_img = imagecreatetruecolor($new_width$new_height); 
  102.             //拷贝剪切图像到背景画板,并按比例裁剪 
  103.             imagecopyresampled($new_img$mid_img, 0, 0, 0, 0, $new_width$new_height$mid_width$mid_height); 
  104.             /* 按格式保存为图片 */ 
  105.             switch ($img_type) { 
  106.                 case IMAGETYPE_JPEG : 
  107.                     imagejpeg($new_img$dst_file, 100); 
  108.                     break
  109.                 case IMAGETYPE_PNG : 
  110.                     imagepng($new_img$dst_file, 9); 
  111.                     break
  112.                 case IMAGETYPE_GIF : 
  113.                     imagegif($new_img$dst_file, 100); 
  114.                     break
  115.                 default
  116.                     break
  117.             } 
  118.         } 
  119.         return ltrim($dst_file'.'); 
  120.     } 

附件是一个有样例图片的测试demo,不过,这个函数不支持动态gif图片的裁剪缩放.

方法二,代码如下:

  1. <?php 
  2. list($src_w,$src_h)=getimagesize($src_img);  // 获取原图尺寸 
  3. $dst_scale = $dst_h/$dst_w//目标图像长宽比 
  4. $src_scale = $src_h/$src_w// 原图长宽比 
  5.  
  6. if($src_scale>=$dst_scale
  7. {   
  8.  // 过高 
  9.  $w = intval($src_w); 
  10.  $h = intval($dst_scale*$w); 
  11.  $x = 0; 
  12.  $y = ($src_h - $h)/3; 
  13. else 
  14. {  
  15. // 过宽 
  16.  $h = intval($src_h); 
  17.  $w = intval($h/$dst_scale); 
  18.  $x = ($src_w - $w)/2; 
  19.  $y = 0; 
  20. // 剪裁 
  21. $source=imagecreatefromjpeg($src_img); 
  22. $croped=imagecreatetruecolor($w$h); 
  23. imagecopy($croped,$source,0,0,$x,$y,$src_w,$src_h); 
  24. // 缩放 
  25. $scale = $dst_w/$w
  26. $target = imagecreatetruecolor($dst_w$dst_h); 
  27. $final_w = intval($w*$scale); 
  28. $final_h = intval($h*$scale); 
  29. imagecopysampled($target,$croped,0,0,0,0,$final_w,$final_h,$w,$h); 
  30. // 保存 
  31. $timestamp = time(); 
  32. imagejpeg($target"$timestamp.jpg"); 
  33. imagedestroy($target); 
  34. ?> 

方法三:根据自定义的目标图,按目标图高宽比裁剪、缩放源图.传入参数,代码如下:

  1. $source_path string 源图路径 
  2.  
  3. $target_width integer 目标图宽度 
  4.  
  5. $target_height integer 目标图高度 
  6.  
  7. 支持图片类型: image/gif, image/jpeg, image/png. 
  8.  
  9. function imagecropper($source_path$target_width$target_height
  10.  $source_info   = getimagesize($source_path); 
  11.  $source_width  = $source_info[0]; 
  12.  $source_height = $source_info[1]; 
  13.  $source_mime   = $source_info['mime']; 
  14.  $source_ratio  = $source_height / $source_width
  15.  $target_ratio  = $target_height / $target_width
  16.  
  17.  // 源图过高 
  18.  if ($source_ratio > $target_ratio
  19.  { 
  20.   $cropped_width  = $source_width
  21.   $cropped_height = $source_width * $target_ratio
  22.   $source_x = 0; 
  23.   $source_y = ($source_height - $cropped_height) / 2; 
  24.  } 
  25.  // 源图过宽 
  26.  elseif ($source_ratio < $target_ratio
  27.  { 
  28.   $cropped_width  = $source_height / $target_ratio
  29.   $cropped_height = $source_height
  30.   $source_x = ($source_width - $cropped_width) / 2; 
  31.   $source_y = 0; 
  32.  } 
  33.  // 源图适中 
  34.  else 
  35.  { 
  36.   $cropped_width  = $source_width
  37.   $cropped_height = $source_height
  38.   $source_x = 0; 
  39.   $source_y = 0; 
  40.  } 
  41.  
  42.  switch ($source_mime
  43.  { 
  44.   case 'image/gif'
  45.    $source_image = imagecreatefromgif($source_path); 
  46.    break
  47.  
  48.   case 'image/jpeg'
  49.    $source_image = imagecreatefromjpeg($source_path); 
  50.    break
  51.  
  52.   case 'image/png'
  53.    $source_image = imagecreatefrompng($source_path); 
  54.    break
  55.  
  56.   default
  57.    return false; 
  58.    break
  59.  } 
  60.  
  61.  $target_image  = imagecreatetruecolor($target_width$target_height); 
  62.  $cropped_image = imagecreatetruecolor($cropped_width$cropped_height); 
  63.  
  64.  // 裁剪 
  65.  imagecopy($cropped_image$source_image, 0, 0, $source_x$source_y$cropped_width$cropped_height);  
  66.  // 缩放 
  67.  imagecopyresampled($target_image$cropped_image, 0, 0, 0, 0, $target_width$target_height$cropped_width$cropped_height); 
  68.  
  69.  header('Content-Type: image/jpeg'); 
  70.  imagejpeg($target_image); 
  71.  imagedestroy($source_image); 
  72.  imagedestroy($target_image); 
  73.  imagedestroy($cropped_image); 

Tags: PHP图片裁剪 PHP图片缩放

分享到: