PHP 图片处理函数类 (水印图,缩略图)[等比例压缩与裁剪压缩]

前端之家收集整理的这篇文章主要介绍了PHP 图片处理函数类 (水印图,缩略图)[等比例压缩与裁剪压缩]前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
PHP图片处理函数 类 (水印图,缩略图)[关于等比例压缩与裁剪压缩]感兴趣的小伙伴,下面一起跟随编程之家 jb51.cc的小编两巴掌来看看吧!
近来闲来无事,就想到了再把PHP图片处理函数整来再熟悉熟悉。下面简单的写了一个图片处理类,功能包括:水印,缩略图等。
不过,对于生成缩略图有两种方式:一种是直接按比例来压缩图片,另外一种是先裁剪再压缩的方式。在自己看来等例压缩与裁剪压缩区别就在于:
等例压缩:能保证图片的宽长比例合理,且图片有完整性。但实际大小不保证符合要求。 裁剪压缩: 能保证图片的宽长比例合理,实际大小也能保证。但图片完整性不能保证。 好了,我们还是直接上代码吧。

/**
 * PHP图片处理函数 类 (水印图,缩略图)[关于等比例压缩与裁剪压缩]
 *
 * @param 
 * @arrange 网: jb51.cc
 * 图像处理类
 * @author FC_LAMP
 * @internal功能包含:水印,缩略图
 */
class Img
{
 //图片格式
 private $exts = array ('jpg','jpeg','gif','bmp','png' );
 /**
  * 
  * 
  * @throws Exception
  */
 public function __construct()
 {
  if (! function_exists ( 'gd_info' ))
  {
   throw new Exception ( '加载GD库失败!' );
  }
 }
 /**
  * 
  * 裁剪压缩
  * @param $src_img 图片
  * @param $save_img 生成后的图片
  * @param $option 参数选项,包括: $maxwidth  宽  $maxheight 高
  * array('width'=>xx,'height'=>xxx)
  * @internal
  * 我们一般的压缩图片方法,在图片过长或过宽时生成图片
  * 都会被“压扁”,针对这个应采用先裁剪后按比例压缩的方法
  */
 public function thumb_img($src_img,$save_img = '',$option)
 {
  if (empty ( $option ['width'] ) or empty ( $option ['height'] ))
  {
   return array ('flag' => False,'msg' => '原图长度与宽度不能小于0' );
  }
  $org_ext = $this->is_img ( $src_img );
  if (! $org_ext ['flag'])
  {
   return $org_ext;
  }
  //如果有保存路径,则确定路径是否正确
  if (! empty ( $save_img ))
  {
   $f = $this->check_dir ( $save_img );
   if (! $f ['flag'])
   {
	return $f;
   }
  }
  //获取出相应的方法
  $org_funcs = $this->get_img_funcs ( $org_ext ['msg'] );
  //获取原大小
  $source = $org_funcs ['create_func'] ( $src_img );
  $src_w = imagesx ( $source );
  $src_h = imagesy ( $source );
  //调整原始图像(保持图片原形状裁剪图像)
  $dst_scale = $option ['height'] / $option ['width']; //目标图像长宽比
  $src_scale = $src_h / $src_w; // 原图长宽比
  if ($src_scale >= $dst_scale)
  { // 过高
   $w = intval ( $src_w );
   $h = intval ( $dst_scale * $w );
   $x = 0;
   $y = ($src_h - $h) / 3;
  } else
  { // 过宽
   $h = intval ( $src_h );
   $w = intval ( $h / $dst_scale );
   $x = ($src_w - $w) / 2;
   $y = 0;
  }
  // 剪裁
  $croped = imagecreatetruecolor ( $w,$h );
  imagecopy ( $croped,$source,$x,$y,$src_w,$src_h );
  // 缩放
  $scale = $option ['width'] / $w;
  $target = imagecreatetruecolor ( $option ['width'],$option ['height'] );
  $final_w = intval ( $w * $scale );
  $final_h = intval ( $h * $scale );
  imagecopyresampled ( $target,$croped,$final_w,$final_h,$w,$h );
  imagedestroy ( $croped );
  //输出(保存)图片
  if (! empty ( $save_img ))
  {
   $org_funcs ['save_func'] ( $target,$save_img );
  } else
  {
   header ( $org_funcs ['header'] );
   $org_funcs ['save_func'] ( $target );
  }
  imagedestroy ( $target );
  return array ('flag' => True,'msg' => '' );
 }
 /**
  * 
  * 等比例缩放图像
  * @param $src_img 原图片
  * @param $save_img 需要保存的地方
  * @param $option 参数设置 array('width'=>xx,'height'=>xxx)
  * 
  */
 function resize_image($src_img,$option)
 {
  $org_ext = $this->is_img ( $src_img );
  if (! $org_ext ['flag'])
  {
   return $org_ext;
  }
  //如果有保存路径,则确定路径是否正确
  if (! empty ( $save_img ))
  {
   $f = $this->check_dir ( $save_img );
   if (! $f ['flag'])
   {
	return $f;
   }
  }
  //获取出相应的方法
  $org_funcs = $this->get_img_funcs ( $org_ext ['msg'] );
  //获取原大小
  $source = $org_funcs ['create_func'] ( $src_img );
  $src_w = imagesx ( $source );
  $src_h = imagesy ( $source );
  if (($option ['width'] && $src_w > $option ['width']) || ($option ['height'] && $src_h > $option ['height']))
  {
   if ($option ['width'] && $src_w > $option ['width'])
   {
	$widthratio = $option ['width'] / $src_w;
	$resizewidth_tag = true;
   }
   if ($option ['height'] && $src_h > $option ['height'])
   {
	$heightratio = $option ['height'] / $src_h;
	$resizeheight_tag = true;
   }
   if ($resizewidth_tag && $resizeheight_tag)
   {
	if ($widthratio < $heightratio)
	 $ratio = $widthratio;
	else
	 $ratio = $heightratio;
   }
   if ($resizewidth_tag && ! $resizeheight_tag)
	$ratio = $widthratio;
   if ($resizeheight_tag && ! $resizewidth_tag)
	$ratio = $heightratio;
   $newwidth = $src_w * $ratio;
   $newheight = $src_h * $ratio;
   if (function_exists ( "imagecopyresampled" ))
   {
	$newim = imagecreatetruecolor ( $newwidth,$newheight );
	imagecopyresampled ( $newim,$newwidth,$newheight,$src_h );
   } else
   {
	$newim = imagecreate ( $newwidth,$newheight );
	imagecopyresized ( $newim,$src_h );
   }
  }
  //输出(保存)图片
  if (! empty ( $save_img ))
  {
   $org_funcs ['save_func'] ( $newim,$save_img );
  } else
  {
   header ( $org_funcs ['header'] );
   $org_funcs ['save_func'] ( $newim );
  }
  imagedestroy ( $newim );
  return array ('flag' => True,'msg' => '' );
 }
 /**
  * 
  * 生成水印图片
  * @param  $org_img 原图像
  * @param  $mark_img 水印标记图像
  * @param  $save_img 当其目录不存在时,会试着创建目录
  * @param array $option 为水印的一些基本设置包含:
  * x:水印的水平位置,默认为减去水印图宽度后的值
  * y:水印的垂直位置,默认为减去水印图高度后的值
  * alpha:alpha值(控制透明度),默认为50
  */
 public function water_mark($org_img,$mark_img,$option = array())
 {
  //检查图片
  $org_ext = $this->is_img ( $org_img );
  if (! $org_ext ['flag'])
  {
   return $org_ext;
  }
  $mark_ext = $this->is_img ( $mark_img );
  if (! $mark_ext ['flag'])
  {
   return $mark_ext;
  }
  //如果有保存路径,则确定路径是否正确
  if (! empty ( $save_img ))
  {
   $f = $this->check_dir ( $save_img );
   if (! $f ['flag'])
   {
	return $f;
   }
  }
  //获取相应画布
  $org_funcs = $this->get_img_funcs ( $org_ext ['msg'] );
  $org_img_im = $org_funcs ['create_func'] ( $org_img );
  $mark_funcs = $this->get_img_funcs ( $mark_ext ['msg'] );
  $mark_img_im = $mark_funcs ['create_func'] ( $mark_img );
  //拷贝水印图片坐标
  $mark_img_im_x = 0;
  $mark_img_im_y = 0;
  //拷贝水印图片高宽
  $mark_img_w = imagesx ( $mark_img_im );
  $mark_img_h = imagesy ( $mark_img_im );
  $org_img_w = imagesx ( $org_img_im );
  $org_img_h = imagesx ( $org_img_im );
  //合成生成点坐标
  $x = $org_img_w - $mark_img_w;
  $org_img_im_x = isset ( $option ['x'] ) ? $option ['x'] : $x;
  $org_img_im_x = ($org_img_im_x > $org_img_w or $org_img_im_x < 0) ? $x : $org_img_im_x;
  $y = $org_img_h - $mark_img_h;
  $org_img_im_y = isset ( $option ['y'] ) ? $option ['y'] : $y;
  $org_img_im_y = ($org_img_im_y > $org_img_h or $org_img_im_y < 0) ? $y : $org_img_im_y;
  //alpha
  $alpha = isset ( $option ['alpha'] ) ? $option ['alpha'] : 50;
  $alpha = ($alpha > 100 or $alpha < 0) ? 50 : $alpha;
  //合并图片
  imagecopymerge ( $org_img_im,$mark_img_im,$org_img_im_x,$org_img_im_y,$mark_img_im_x,$mark_img_im_y,$mark_img_w,$mark_img_h,$alpha );
  //输出(保存)图片
  if (! empty ( $save_img ))
  {
   $org_funcs ['save_func'] ( $org_img_im,$save_img );
  } else
  {
   header ( $org_funcs ['header'] );
   $org_funcs ['save_func'] ( $org_img_im );
  }
  //销毁画布
  imagedestroy ( $org_img_im );
  imagedestroy ( $mark_img_im );
  return array ('flag' => True,'msg' => '' );
 }
 /**
  * 
  * 检查图片
  * @param unknown_type $img_path
  * @return array('flag'=>true/false,'msg'=>ext/错误信息) 
  */
 private function is_img($img_path)
 {
  if (! file_exists ( $img_path ))
  {
   return array ('flag' => False,'msg' => "加载图片 $img_path 失败!" );
  }
  $ext = explode ( '.',$img_path );
  $ext = strtolower ( end ( $ext ) );
  if (! in_array ( $ext,$this->exts ))
  {
   return array ('flag' => False,'msg' => "图片 $img_path 格式不正确!" );
  }
  return array ('flag' => True,'msg' => $ext );
 }
 /**
  * 
  * 返回正确的图片函数
  * @param unknown_type $ext
  */
 private function get_img_funcs($ext)
 {
  //选择
  switch ($ext)
  {
   case 'jpg' :
	$header = 'Content-Type:image/jpeg';
	$createfunc = 'imagecreatefromjpeg';
	$savefunc = 'imagejpeg';
	break;
   case 'jpeg' :
	$header = 'Content-Type:image/jpeg';
	$createfunc = 'imagecreatefromjpeg';
	$savefunc = 'imagejpeg';
	break;
   case 'gif' :
	$header = 'Content-Type:image/gif';
	$createfunc = 'imagecreatefromgif';
	$savefunc = 'imagegif';
	break;
   case 'bmp' :
	$header = 'Content-Type:image/bmp';
	$createfunc = 'imagecreatefrombmp';
	$savefunc = 'imagebmp';
	break;
   default :
	$header = 'Content-Type:image/png';
	$createfunc = 'imagecreatefrompng';
	$savefunc = 'imagepng';
  }
  return array ('save_func' => $savefunc,'create_func' => $createfunc,'header' => $header );
 }
 /**
  * 
  * 检查并试着创建目录
  * @param $save_img
  */
 private function check_dir($save_img)
 {
  $dir = dirname ( $save_img );
  if (! is_dir ( $dir ))
  {
   if (! mkdir ( $dir,0777,true ))
   {
	return array ('flag' => False,'msg' => "图片保存目录 $dir 无法创建!" );
   }
  }
  return array ('flag' => True,'msg' => '' );
 }
}
if (! empty ( $_FILES ['test'] ['tmp_name'] ))
{
 //例子
 $img = new Img ();
 //原图
 $name = explode ( '.',$_FILES ['test'] ['name'] );
 $org_img = 'D:/test.' . end ( $name );
 move_uploaded_file ( $_FILES ['test'] ['tmp_name'],$org_img );
 $option = array ('width' => $_POST ['width'],'height' => $_POST ['height'] );
 if ($_POST ['type'] == 1)
 {
  $s = $img->resize_image ( $org_img,'',$option );
 } else
 {
  $img->thumb_img ( $org_img,$option );
 }
 unlink ( $org_img );
}


/***   来自编程之家 jb51.cc(jb51.cc)   ***/

猜你在找的PHP相关文章