php任意图像裁剪成固定大小[zz]

http://blog.csdn.net/microji/archive/2008/12/19/3551042.aspx

 

做一个首页调用图像,有时候往往需要获得固定大小的图像,因为首页的图像位置通常由设计人员指定好了,如果是做最新发布图像调用,因为不知道客户会上传什 么比例的图像,所以,有时候也就没有办法确定图像的比例,前台页面编写人员通常会采用固定  img 元素高宽的办法来达到控制图像不溢出,但如果图像的比例不是需要的比例,就会造成图像调用后变形,很大程度上影响了页面的美观,有解决的方法是,按照原图 比例进行缩放,缩放后的图像难免会有空白,空白处填以颜色,这样虽然图像不变形了,但这样会有很多问题,比如,如果用户发一个图像很高但宽度一般的图像, 如果压缩成一个1:1的图像,那么压缩后基本就会看不到图像了。
   我这里的解决办法是,任意图像裁剪成固定大小,图像不变形,空白处拉伸填充,图像始终铺满,不留空白,用过bcastr的朋友应该知道,bcastr就是保证了图像调用的不变形,对一个固定大小输出的图像框,源图有以下几种情况:
1:需要输出的图像的高宽比源图的高宽都小,写成判断 $new_width<$src_width && $new_height<$src_width
2:需要输出的图像的高宽比原图的高宽都大,写成判断 $new_width>$src_width && $new_height>$src_width
3:排除第1,2两种,即一边放大,一边缩小的情况加上等于的判断
对于1,2,函数处理代码完全相同,所以可以归纳成一个处理语句


  1. <?php 
  2.      /*  
  3.     *  说明:函数功能是把一个图像裁剪为任意大小的图像,图像不变形    
  4.     *  参数说明:输入 需要处理图片的 文件名,生成新图片的保存文件名,生成新图片的宽,生成新图片的高
  5.     *  written by smallchicken
  6.     *  time 2008-12-18
  7.     */
  8.     // 获得任意大小图像,不足地方拉伸,不产生变形,不留下空白 
  9.     
  10.      function  my_image_resize( $src_file$dst_file  ,  $new_width  ,  $new_height )
  11.     {
  12.          if ( $new_width  <1 ||  $new_height  <1)
  13.         {
  14.              echo   "params width or height error !" ;
  15.              exit ();
  16.         }
  17.          if (! file_exists ( $src_file ))
  18.         {
  19.              echo   $src_file  .  " is not exists !" ;
  20.              exit ();
  21.         }
  22.          // 图像类型 
  23.          $type =exif_imagetype( $src_file );
  24.          $support_type = array (IMAGETYPE_JPEG , IMAGETYPE_PNG , IMAGETYPE_GIF);
  25.          if (!in_array( $type$support_type ,true))
  26.         {
  27.              echo   "this type of image does not support! only support jpg , gif or png" ;
  28.              exit ();
  29.         }
  30.          //Load image
  31.          switch ( $type )
  32.         {
  33.              case  IMAGETYPE_JPEG :  
  34.                          $src_img =imagecreatefromjpeg( $src_file );
  35.                          break ;
  36.              case  IMAGETYPE_PNG :
  37.                          $src_img =imagecreatefrompng( $src_file );
  38.                          break ;
  39.              case  IMAGETYPE_GIF :
  40.                          $src_img =imagecreatefromgif( $src_file );
  41.                          break ;
  42.              default :
  43.                          echo   "Load image error!" ;
  44.                          exit ();
  45.         }
  46.          $w =imagesx( $src_img );
  47.          $h =imagesy( $src_img );
  48.          $ratio_w =1.0 *  $new_width   /  $w ;
  49.          $ratio_h =1.0 *  $new_height  /  $h ;
  50.          $ratio =1.0;
  51.          // 生成的图像的高宽比原来的都小,或都大 ,原则是 取大比例放大,取大比例缩小(缩小的比例就比较小了)  
  52.          if ( ( $ratio_w  < 1 &&  $ratio_h  < 1) || ( $ratio_w  > 1 &&  $ratio_h  > 1))
  53.         {
  54.                  if ( $ratio_w  <  $ratio_h )
  55.                 {
  56.                      $ratio  =  $ratio_h  ;    // 情况一,宽度的比例比高度方向的小,按照高度的比例标准来裁剪或放大 
  57.                 } else  {
  58.                      $ratio  =  $ratio_w  ;
  59.                 }
  60.                   // 定义一个中间的临时图像,该图像的宽高比 正好满足目标要求 
  61.                  $inter_w =(int)( $new_width  /  $ratio );
  62.                  $inter_h =(int) ( $new_height  /  $ratio );
  63.                  $inter_img =imagecreatetruecolor( $inter_w  ,  $inter_h );
  64.                 imagecopy( $inter_img$src_img , 0,0,0,0, $inter_w , $inter_h );
  65.                   // 生成一个以最大边长度为大小的是目标图像$ratio比例的临时图像
  66.                   // 定义一个新的图像 
  67.                  $new_img =imagecreatetruecolor( $new_width , $new_height );
  68.                 imagecopyresampled( $new_img , $inter_img ,0,0,0,0, $new_width , $new_height , $inter_w , $inter_h );
  69.                  switch ( $type )
  70.                 {
  71.                          case     IMAGETYPE_JPEG :        
  72.                                     imagejpeg( $new_img$dst_file ,100);    // 存储图像
  73.                                      break ;
  74.                          case  IMAGETYPE_PNG :
  75.                                     imagepng( $new_img , $dst_file );
  76.                                      break ;
  77.                          case  IMAGETYPE_GIF :
  78.                                     imagegif( $new_img , $dst_file );
  79.                                      break ;
  80.                          default :
  81.                                      break
  82.                 }
  83.         }  // end if 1
  84.           // 2 目标图像 的一个边大于原图,一个边小于原图 ,先放大平普图像,然后裁剪  
  85.          //  =if( ($ratio_w < 1 && $ratio_h > 1)  || ($ratio_w >1 && $ratio_h <1) )      
  86.          else {
  87.                  $ratio = $ratio_h > $ratio_w$ratio_h  :  $ratio_w ;   //取比例大的那个值 
  88.                  // 定义一个中间的大图像,该图像的高或宽和目标图像相等,然后对原图放大 
  89.                  $inter_w =(int)( $w  *  $ratio );
  90.                  $inter_h =(int) ( $h  *  $ratio );
  91.                  $inter_img =imagecreatetruecolor( $inter_w  ,  $inter_h );
  92.                        //将原图缩放比例后裁剪 
  93.                 imagecopyresampled( $inter_img , $src_img ,0,0,0,0, $inter_w , $inter_h , $w , $h );
  94.                     // 定义一个新的图像 
  95.                  $new_img =imagecreatetruecolor( $new_width , $new_height );
  96.                 imagecopy( $new_img$inter_img , 0,0,0,0, $new_width , $new_height );
  97.                  switch ( $type )
  98.                 {
  99.                          case     IMAGETYPE_JPEG :        
  100.                                     imagejpeg( $new_img$dst_file ,100);     // 存储图像
  101.                                      break ;
  102.                          case  IMAGETYPE_PNG :
  103.                                     imagepng( $new_img , $dst_file );
  104.                                      break ;
  105.                          case  IMAGETYPE_GIF :
  106.                                     imagegif( $new_img , $dst_file );
  107.                                      break ;
  108.                          default :
  109.                                      break
  110.                 } 
  111.         } // if3 
  112. } // end function
  113. ?>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值