常用的php图片处理类(水印、等比缩放、固定高宽)分享

前端技术 2023/09/09 PHP

常用的php图片处理类(水印、等比缩放、固定高宽)分享

<?php  
//PHP 添加水印 & 比例缩略图 & 固定高度 & 固定宽度 类。 
class Image_process{ 
  public $source; //原图 
  public $source_width;  //原图宽度 
  public $source_height; //原图高度 
  public $source_type_id; 
  public $orign_name; 
  public $orign_dirname; 
    
  //传入原图路径 
  public function __construct($source){ 
    $this->typeList = array(1=>\'gif\',2=>\'jpg\',3=>\'png\'); 
    $ginfo = getimagesize($source); 
    $this->source_width = $ginfo[0]; 
    $this->source_height = $ginfo[1]; 
    $this->source_type_id = $ginfo[2]; 
    $this->orign_url = $source; 
    $this->orign_name = basename($source); 
    $this->orign_dirname = dirname($source); 
  } 
    
  //判断图片的文件的格式,返回PHP可识别的编码 
  public function judgeType($type,$source){ 
    if($type == 1){ 
      return imagecreatefromgif($source); //gif 
    }else if($type == 2){ 
      return imagecreatefromjpeg($source); //jpg 
    }else if($type == 3){ 
      return imagecreatefrompng($source); //png 
    }else{ 
      return false; 
    } 
  } 
    
  //生成水印图片 
  public function waterMakeImage($logo){ 
    $linfo = getimagesize($logo); 
    $logo_width = $linfo[0]; 
    $logo_height = $linfo[1]; 
    $logo_type_id = $linfo[2]; 
    $sourceHandle = $this->judgeType($this->source_type_id,$this->orign_url); 
    $logoHandle = $this->judgeType($logo_type_id,$logo); 
    if(!$sourceHandle || !$logoHandle){ 
      return false; 
    } 
    $x = ($this->source_width - $logo_width)/2; 
    $y = ($this->source_height - $logo_height)/2; 
    imagecopy($sourceHandle,$logoHandle,$x,$y,0,0,$logo_width,$logo_height); 
    $newPic = $this->orign_dirname.\'\\water_\'.time().\'.\'.$this->typeList[$this->source_type_id]; 
    if($this->saveImage($sourceHandle,$newPic)){ 
      imagedestroy($sourceHandle); 
      imagedestroy($logoHandle); 
    } 
  } 
    
  //固定高度宽度 
  public function fixSizeImage($width,$height){ 
    if($width > $this->source_width) $this->source_width; 
    if($height > $this->source_height) $this->source_height; 
    if($width === false){ 
      $width = floor($this->source_width / ($this->source_height / $height)); 
    } 
    if($height === false){ 
      $height = floor($this->source_height / ($this->source_width / $width)); 
    } 
    $this->tinyImage($width,$height); 
  } 
    
  //等比例缩放图片 
  public function scaleImage($scale){ 
    $width = floor($this->source_width * $scale); 
    $height = floor($this->source_height * $scale); 
    $this->tinyImage($width, $height); 
  } 
    
  //创建缩略图 
  public function tinyImage($width,$height){ 
    $tinyImage = imagecreatetruecolor($width,$height); 
    $handle = $this->judgeType($this->source_type_id,$this->orign_url); 
    if(function_exists(\'imagecopyresampled\')){ 
      imagecopyresampled($tinyImage, $handle, 0, 0, 0, 0, $width, $height, $this->source_width, $this->source_height); 
    }else{ 
      imagecopyresized($tinyImage, $handle, 0, 0, 0, 0, $width, $height, $this->source_width, $this->source_height); 
    } 
    $newPic = $this->orign_dirname.\'\\thumb_\'.time().\'_\'.$width.\"_\".$height.\".\".$this->typeList[$this->source_type_id]; 
    if($this->saveImage($tinyImage,$newPic)){ 
      imagedestroy($tinyImage); 
      imagedestroy($handle); 
    } 
  } 
  //保存图片 
  private function saveImage($image,$url){ 
    if(imagejpeg($image,$url)){ 
      return true; 
    } 
  } 
} 
$imgHandle = new Image_process(\'D:\\AppServ\\www\\test\\getimg\\14061907445601.jpg\'); 
//$imgHandle->waterMakeImage(\'D:\\AppServ\\www\\test\\getimg\\shougongke.png\');  //生成水印图片 
//$imgHandle->fixSizeImage(200,150); //固定长度图片 
$imgHandle->scaleImage(0.2); //等比例缩放 
?>

示例二:

<?php
/**
 * 
 * 图像处理类
 * @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, 0, 0, $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, 0, 0, 0, 0, $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, $save_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, $source, 0, 0, 0, 0, $newwidth, $newheight, $src_w, $src_h );
  } else
  {
  $newim = imagecreate ( $newwidth, $newheight );
  imagecopyresized ( $newim, $source, 0, 0, 0, 0, $newwidth, $newheight, $src_w, $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, $save_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 );
}

以上所述就是本文的全部内容了,希望大家能够喜欢。

本文地址:https://www.stayed.cn/item/24754

转载请注明出处。

本站部分内容来源于网络,如侵犯到您的权益,请 联系我

我的博客

人生若只如初见,何事秋风悲画扇。