首页 > 语言 > PHP > 正文

php图片上传类,支持加水印,生成略缩图

2024-09-04 11:44:10
字体:
来源:转载
供稿:网友

分享一个网友写的php图片上传类,支持加水印,生成略缩图功能,里面是配置和可以获取的一些信息,每一个配置信息都有默认值,如无特殊需要,可以不配置,PHP类代码如下:

  1. <?php 
  2. /*---------------------------------------------------------------------------------- 
  3.  *  
  4.  *----------------------------------------------------------------------------------  
  5.  */ 
  6. class image_up{ 
  7.  //定义基本参数 
  8.  private $uptype=array('image/jpg','image/jpeg','image/png','image/pjpeg','image/gif','image/bmp','image/x-png');  //上传文件类型 
  9.  private $max_file_size=102400;    //上传大小限制(单位:KB) 
  10.  private $destination_folder="up/"//上传文件路径 
  11.  private $watermark=1;              //是否附加水印 
  12.  private $watertype=1;              //水印类型(1为文字,2为图片) 
  13.  private $waterposition=1;          //水印位置(1为左下角,2为右下角,3为左上角,4为右上角,5为居中); 
  14.  private $waterstring=null;         //水印字符串 
  15.  private $waterimg=null;            //水印图片 
  16.  private $imgpreview=1;             //是否生成预览图(1为生成,其他为不生成); 
  17.  private $imgpreviewsize=1;         //预览图比例,0为按固定宽和高显示,其他为比例显示 
  18.  private $imgwidth=200;             //预览图固定宽度 
  19.  private $imgheight=200;            //预览图固定高度 
  20.  //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
  21.  private $imgthu=1;                     //是否生成且保存略缩图,1为生成,0为不生成 
  22.  private $imgthu_folder=null;           //略缩图保存路径,默认与文件路径一致 
  23.  private $imgthu_fixed=0;               //略缩图是否使用固定宽高,1为使用,0为灵活变动 
  24.  private $imgthu_width=200;             //略缩图宽度 
  25.  private $imgthu_height=200;            //略缩图高度 
  26.   
  27.  private $imgthu_name=null;             //略缩图名称 
  28.  //****************************************************************************************************************** 
  29.  private $inputname="upfile";       //文件上传框名称 
  30.  //****************************************************************************************************************** 
  31.  private $img_preview_display;      //图片预览图显示 
  32.  //****************************************************************************************************************** 
  33.  //文件上传相关信息,1为文件不存在,2为类型不符合,3为超出大小限制,4为上传失败,0为上传成功 
  34.  private $file_up_info=null; 
  35.  //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
  36.  //可在外部获取上传文件基本信息 
  37.  private $file_name;         //客服端文件的原名称 
  38.  private $file_type;         //文件的MIME类型 
  39.  private $file_size;         //已上传文件的大小,单位/字节 
  40.  private $file_tmp_name;     //储存的临时文件名 
  41.  private $file_error;        //该文件上传相关错误代码 
  42.  
  43.  private $img_size;          //取得图片的长宽 
  44.  private $file_basename;     //获取带扩展名的全名 
  45.  private $file_extension;    //获取文件扩展名 
  46.  private $filename;          //文件名(不带扩展名) 
  47.  private $destination;       //问价路径加名称 
  48.  //****************************************************************************************************************** 
  49.  public function __set($propety_name,$value){ 
  50.   $this->$propety_name=$value
  51.  } 
  52.  public function __get($property_name){ 
  53.   if(isset($this->$property_name)) 
  54.   return($this->$property_name); 
  55.   else return(NULL); 
  56.  } 
  57.  //****************************************************************************************************************** 
  58.  //定义文件上传功能 
  59.  public function up(){ 
  60.   //判断文件是否存在 
  61.   if(!is_uploaded_file($_FILES[$this->inputname]["tmp_name"])){ 
  62.    $this->file_up_info=1; 
  63.    return
  64.   } 
  65.   //获取并赋值相应基本参数 
  66.   $upfile=$_FILES[$this->inputname]; 
  67.   $this->file_name=$upfile["name"]; 
  68.   $this->file_type=$upfile["type"]; 
  69.   $this->file_size=$upfile["size"]; 
  70.   $this->file_tmp_name=$upfile["tmp_name"]; 
  71.   $this->file_error=$upfile["error"]; 
  72.   //检查文件类型是否符合 
  73.   if(!in_array($this->file_type,$this->uptype)){ 
  74.    $this->file_up_info=2; 
  75.    return
  76.   } 
  77.   //检查文件大小是否超出限制 
  78.   if($this->file_size>$this->max_file_size){ 
  79.    $this->file_up_info=3; 
  80.    return
  81.   } 
  82.   //判断目录是否存在 
  83.   if(!file_exists($this->destination_folder)) 
  84.   mkdir($this->destination_folder); 
  85.   //进一步取得图片的信息并赋值 
  86.   $this->img_size=getimagesize($this->file_tmp_name); 
  87.   $pathinfo=pathinfo($this->file_name); 
  88.   $this->file_extension=$pathinfo["extension"];    //获取文件扩展名 
  89.   $this->file_basename=$pathinfo["basename"];      //获取带扩展名的全名 
  90.   $this->filename=$pathinfo["filename"];           //文件名(不带扩展名) 
  91.   $filename2=$pathinfo['filename']; 
  92.   $this->destination = $this->destination_folder.$this->filename.".".$this->file_extension; 
  93.   //判断文件名是否存在,如果存在则重命名 
  94.   $n=1; 
  95.   while (file_exists($this->destination)){ 
  96.    while (file_exists($this->destination)){ 
  97.     $n++; 
  98.     $this->filename=$this->filename."(".$n.")"
  99.     $this->destination = $this->destination_folder.$this->filename.".".$this->file_extension; 
  100.    } 
  101.    $this->filename=$filename2."(".$n.")"
  102.    $this->destination = $this->destination_folder.$this->filename.".".$this->file_extension; 
  103.   } 
  104.   //移动上传的文件 
  105.   if(move_uploaded_file($this->file_tmp_name,$this->destination)) 
  106.   $this->file_up_info=0; 
  107.   else $this->file_up_info=4; 
  108.     
  109.   //添加水印 
  110.   if($this->watermark==1){ 
  111.    $this->imgthu(); 
  112.   } 
  113.   //生成略缩图 
  114.   if($this->imgthu==1){ 
  115.    $this->add_watermark(); 
  116.   } 
  117.   //生成预览图 
  118.   if($this->imgpreviewsize == 0){ 
  119.    if($this->img_size["0"]<$this->imgwidth) $this->imgwidth=$this->img_size["0"]; 
  120.    if($this->img_size["1"]<$this->imgheight) $this->imgheight=$this->img_size["1"]; 
  121.   }else
  122.    $this->imgwidth=$this->img_size["0"]*$this->imgpreviewsize; 
  123.    $this->imgheight=$this->img_size["1"]*$this->imgpreviewsize; 
  124.   } 
  125.   $this->img_preview_display="<img src='$this->destination' width='$this->imgwidth' height='$this->imgheight' 
  126.                                     alt='图片预览:r文件名'$this->file_tmp_name />"; 
  127.  } 
  128. //==================================================================================================================== 
  129. //====================================================================================================================  
  130.  //生成略缩图功能 
  131.  function imgthu(){ 
  132.   if($this->imgthu_folder==null) 
  133.     $this->imgthu_folder=$this->destination_folder; 
  134.    
  135.   //$this->imgthu_name=$this->filename."_t.".$this->file_extension; 
  136.   $imgthu_name_b=$this->filename."_t"
  137.   $imgthu_name_b2=$this->filename."_t"
  138.   $destination_b=$this->imgthu_folder.$imgthu_name_b.".".$this->file_extension; 
  139.      //判断文件名是否存在,如果存在则重命名 
  140.   $n=1; 
  141.   while (file_exists($destination_b)){ 
  142.    while (file_exists($destination_b)){ 
  143.     $n++; 
  144.     $imgthu_name_b=$imgthu_name_b."(".$n.")"
  145.     $destination_b = $this->imgthu_folder.$imgthu_name_b.".".$this->file_extension; 
  146.    } 
  147.    $imgthu_name_b=$imgthu_name_b2."(".$n.")"
  148.    $destination_b = $this->imgthu_folder.$imgthu_name_b.".".$this->file_extension; 
  149.   } 
  150.    
  151.    
  152.   $imginfo=getimagesize($this->destination); 
  153.   switch($imginfo[2]) 
  154.   { 
  155.    case 1: 
  156.     $in=@imagecreatefromgif($this->destination); 
  157.     break
  158.    case 2: 
  159.     $in=@imagecreatefromjpeg($this->destination); 
  160.     break
  161.    case 3: 
  162.     $in=@imagecreatefrompng($this->destination); 
  163.     break
  164.    case 6: 
  165.     $in =@imagecreatefrombmp($this->destination); 
  166.     break
  167.    default
  168.     break
  169.   } 
  170.   //计算略缩图长宽 
  171.   if($this->imgthu_fixed==0){ 
  172.    if($this->imgthu_height>($imginfo[1]/$imginfo[0])*$this->imgthu_width) 
  173.     $this->imgthu_width = ($imginfo[0]/$imginfo[1])*$this->imgthu_height; 
  174.    else 
  175.     $this->imgthu_height=($imginfo[1]/$imginfo[0])*$this->imgthu_width; 
  176.   } 
  177.   $new = imageCreateTrueColor($this->imgthu_width,$this->imgthu_height); 
  178.   ImageCopyResized($new,$in,0,0,0,0,$this->imgthu_width,$this->imgthu_height,$imginfo[0],$imginfo[1]); 
  179.   switch ($imginfo[2]) 
  180.   { 
  181.    case 1: 
  182.     imagejpeg($new,$destination_b); 
  183.     break
  184.    case 2: 
  185.     imagejpeg($new,$destination_b); 
  186.     break
  187.    case 3: 
  188.     imagepng($new,$destination_b); 
  189.     break
  190.    case 6: 
  191.     imagewbmp($new,$destination_b); 
  192.     break
  193.   } 
  194.  } 
  195. //==================================================================================================================== 
  196. //====================================================================================================================  
  197.  //添加水印功能 
  198.  function add_watermark(){ 
  199.   //1 = GIF,2 = JPG,3 = PNG,4 = SWF,5 = PSD,6 = BMP,7 = TIFF(intel byte order), 
  200.   //8 = TIFF(motorola byte order),9 = JPC,10 = JP2,11 = JPX,12 = JB2,13 = SWC,14 = IFF,15 = WBMP,16 = XBM。 
  201.   $imginfo=getimagesize($this->destination); 
  202.   $im=imagecreatetruecolor($this->img_size[0],$this->img_size[1]);       //创建真彩色 
  203.   $white=imagecolorallocate($im,255,255,255);                            //设置颜色 
  204.   $black=imagecolorallocate($im,0,0,0); 
  205.   $red=imagecolorallocate($im,255,0,0); 
  206.   //在 image 图像的坐标 x,y(图像左上角为 0, 0)处用 color 颜色执行区域填充(即与 x, y 点颜色相同且相邻的点都会被填充)。 
  207.   imagefill($im,0,0,$white); 
  208.  
  209.   switch($imginfo[2]) 
  210.   { 
  211.    case 1: 
  212.     $simage =imagecreatefromgif($this->destination);      // 创建一个新的形象,从文件或 URL 
  213.     break
  214.    case 2: 
  215.     $simage =imagecreatefromjpeg($this->destination); 
  216.     break
  217.    case 3: 
  218.     $simage =imagecreatefrompng($this->destination); 
  219.     break
  220.    case 6: 
  221.     $simage =imagecreatefromwbmp($this->destination); 
  222.     break
  223.    default
  224.     echo ("不支持的文件类型"); 
  225.     break
  226.   } 
  227.   if(!emptyempty($simage)) 
  228.   { 
  229.    //位置设置 
  230.    if($this->watertype==1){ 
  231.     $str_len=strlen($this->waterstring); 
  232.        $str_width=$str_len*10; 
  233.        $str_height=20; 
  234.    }elseif($this->watertype==1 && file_exists($this->waterimg)){ 
  235.     $iinfo=getimagesize($this->waterimg); 
  236.     $str_width = $iinfo[0]; 
  237.     $str_height = $iinfo[1]; 
  238.    } 
  239.     
  240.    switch ($this->waterposition){ 
  241.     case 1: 
  242.      $p_x=5; 
  243.      $p_y=$this->img_size[1]-$str_height
  244.      break
  245.     case 2: 
  246.      $p_x=$this->img_size[0]-$str_width
  247.      $p_y=$this->img_size[1]-$str_height
  248.      break
  249.     case 3: 
  250.      $p_x=5; 
  251.      $p_y=0; 
  252.      break
  253.     case 4: 
  254.      $p_x=$this->img_size[0]-$str_width
  255.      $p_y=5; 
  256.      break
  257.     case 5: 
  258.      $p_x=($this->img_size[0]-$str_width)/2; 
  259.      $p_y=($this->img_size[1]-$str_height)/2; 
  260.      break
  261.    } 
  262.    imagecopy($im,$simage,0,0,0,0,$this->img_size[0],$this->img_size[1]);   //拷贝图像的一部分 
  263.    //imagefilledrectangle($im,1,$this->img_size[1]-15,130,$this->img_size[1],$white);  //将图片的封闭长方形区域着色 
  264.  
  265.    switch($this->watertype) 
  266.    { 
  267.     case 1:   //加水印字符串 
  268.      imagestring($im,10,$p_x,$p_y,$this->waterstring,$red); 
  269.      break
  270.     case 2:   //加水印图片 
  271.      $simage1 =imagecreatefromgif($this->waterimg); 
  272.      imagecopy($im,$simage1,0,0,0,0,85,15); 
  273.      imagedestroy($simage1); 
  274.      break
  275.    } 
  276.  
  277.    switch ($imginfo[2]) 
  278.    { 
  279.     case 1: 
  280.      //imagegif($nimage, $destination); 
  281.      imagejpeg($im$this->destination); 
  282.      break
  283.     case 2: 
  284.      imagejpeg($im$this->destination); 
  285.      break
  286.     case 3: 
  287.      imagepng($im$this->destination); 
  288.      break;//开源代码Vevb.com 
  289.     case 6: 
  290.      imagewbmp($im$this->destination); 
  291.      break
  292.    } 
  293.    //覆盖原上传文件 
  294.    imagedestroy($im); 
  295.    imagedestroy($simage); 
  296.   } 
  297.  } 
  298. ?> 

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表