最模板 - 外贸网站建设,外贸网站模板

最模板

当前位置: 首页 > 建站教程 > php教程 >

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

时间:2014-07-01 22:13来源:未知 作者:最模板zuimoban 点击: 次
图片指定大小然后由php相关函数来实现图片裁剪功能,前段的js效果在这里就不介绍了,大家可以到网上找有很多这类代码,我只整理了php操作部份. 方法一,代码如下, 图片裁剪缩放函数,支

图片指定大小然后由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. } 
  14. else 
  15. {  
  16. // 过宽 
  17.  $h = intval($src_h); 
  18.  $w = intval($h/$dst_scale); 
  19.  $x = ($src_w - $w)/2; 
  20.  $y = 0; 
  21. } 
  22. // 剪裁 
  23. $source=imagecreatefromjpeg($src_img); 
  24. $croped=imagecreatetruecolor($w, $h); 
  25. imagecopy($croped,$source,0,0,$x,$y,$src_w,$src_h); 
  26. // 缩放 
  27. $scale = $dst_w/$w; 
  28. $target = imagecreatetruecolor($dst_w, $dst_h); 
  29. $final_w = intval($w*$scale); 
  30. $final_h = intval($h*$scale); 
  31. imagecopysampled($target,$croped,0,0,0,0,$final_w,$final_h,$w,$h); 
  32. // 保存 
  33. $timestamp = time(); 
  34. imagejpeg($target, "$timestamp.jpg"); 
  35. imagedestroy($target); 
  36. ?> 

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

  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. { 
  11.  $source_info   = getimagesize($source_path); 
  12.  $source_width  = $source_info[0]; 
  13.  $source_height = $source_info[1]; 
  14.  $source_mime   = $source_info['mime']; 
  15.  $source_ratio  = $source_height / $source_width; 
  16.  $target_ratio  = $target_height / $target_width; 
  17.  
  18.  // 源图过高 
  19.  if ($source_ratio > $target_ratio) 
  20.  { 
  21.   $cropped_width  = $source_width; 
  22.   $cropped_height = $source_width * $target_ratio; 
  23.   $source_x = 0; 
  24.   $source_y = ($source_height - $cropped_height) / 2; 
  25.  } 
  26.  // 源图过宽 
  27.  elseif ($source_ratio < $target_ratio) 
  28.  { 
  29.   $cropped_width  = $source_height / $target_ratio; 
  30.   $cropped_height = $source_height; 
  31.   $source_x = ($source_width - $cropped_width) / 2; 
  32.   $source_y = 0; 
  33.  } 
  34.  // 源图适中 
  35.  else 
  36.  { 
  37.   $cropped_width  = $source_width; 
  38.   $cropped_height = $source_height; 
  39.   $source_x = 0; 
  40.   $source_y = 0; 
  41.  } 
  42.  
  43.  switch ($source_mime) 
  44.  { 
  45.   case 'image/gif': 
  46.    $source_image = imagecreatefromgif($source_path); 
  47.    break; 
  48.  
  49.   case 'image/jpeg': 
  50.    $source_image = imagecreatefromjpeg($source_path); 
  51.    break; 
  52.  
  53.   case 'image/png': 
  54.    $source_image = imagecreatefrompng($source_path); 
  55.    break; 
  56.  
  57.   default: 
  58.    return false; 
  59.    break; 
  60.  } 
  61.  
  62.  $target_image  = imagecreatetruecolor($target_width, $target_height); 
  63.  $cropped_image = imagecreatetruecolor($cropped_width, $cropped_height); 
  64.  
  65.  // 裁剪 
  66.  imagecopy($cropped_image, $source_image, 0, 0, $source_x, $source_y, $cropped_width, $cropped_height);  
  67.  // 缩放 
  68.  imagecopyresampled($target_image, $cropped_image, 0, 0, 0, 0, $target_width, $target_height, $cropped_width, $cropped_height); 
  69.  
  70.  header('Content-Type: image/jpeg'); 
  71.  imagejpeg($target_image); 
  72.  imagedestroy($source_image); 
  73.  imagedestroy($target_image); 
  74.  imagedestroy($cropped_image); 
  75. } 
  76.  
(责任编辑:最模板)
------分隔线----------------------------
栏目列表
推荐内容