代码:
<?php
/*在实例化时候,必须有个html代码中的<input type="file" name="file">中的name的值
 * 不应该在类里输出上传成败的信息.应该通过返回值.给实例化的页面判断是否要输出消息
 * 但是,在不成功的情况下,应该在类的内部输出提示的信息,方便排错*/
class shuiyin_class
{
  protected $image_tmp_name;
  protected $image_name;
  protected $image_type;
  protected $image_error;
  protected $image_shuiyin;
  protected $image_x;
  protected $image_y;
  protected $string_to;
  protected $image_size;
  
  function __construct($upload,$to='')
  {  
    $file = $upload;
    $this->image_shuiyin = '@_yyy微博';
    $this->image_tmp_name = $_FILES[$file]['tmp_name'];
    $this->image_name = $_FILES[$file]['name'];
    $this->image_type = $this->image_type_select();
    $this->image_error = $_FILES[$file]['error'];
    $this->image_size = $_FILES[$file]['size'];
    $to_array = array('right_down','right_up');
    if(in_array($to,$to_array))
    {
      $this->string_to = $to;
    }
    else 
    {
      $this->string_to = 'right_down';
    }
    
  }
  private function image_type_select()
  {
    $image = getimagesize($this->image_tmp_name);
    //echo $image['mime'];
    return  $image['mime'];
  }
  public function image()
  {
        if(!($this->image_error())|| !($this->image_type()))
        {
          $this->unlink_tmp();
          return false;        
        }
      
      if(is_uploaded_file($this->image_tmp_name) && file_exists($this->image_tmp_name))
      {
          if(!$this->createdir('./image_shuiyin'))
          {
            $this->unlink_tmp();
            return false;
          }          
          $name = $this->rename();
          $move = './image_shuiyin/'.$name;
          if(move_uploaded_file($this->image_tmp_name,$move))
          {
            $image_all = getimagesize($move);
            $real_image = array('image/png','image/jpeg');
            /*发现在上传gif类型的图片时候.如果打上水印.那么生产的图片动画效果就没了
             * 如果文件过大.会报出一个内存分配不足的问题.那个提示有点讨厌
             * So. 做了一个判断.把它们给过滤掉.也就是不打水印了,但是保证可以上传.
             * 不知道是否有好处.
             * */
            if($this->image_size < 100000 && in_array($image_all['mime'],$real_image))
            //if(in_array($image_all['mime'],$real_image))
            {
            $this->image_create_shuiyin($move);
            }  
            $this->shuiyin_suolue($move,$name);
            $this->unlink_tmp();
            return true;
          }
          else 
          {
            $this->unlink_tmp();
            return false;
          }
          
      }  
       else 
       {
        echo '文件'.$this->image_name.'不存在';
        $this->unlink_tmp();
        return false;
       }  
        
  }
  private function image_type()
  {
    $image_type_array = array('image/gif','image/png','image/jpeg');
    //echo $this->image_type;
    if(!in_array($this->image_type,$image_type_array))
    {
      echo '不支持的文件类型';
      return false;    
    }
    else 
    {
      return true;
    }
   
  }
  private function image_error()
  {
    $error = $this->image_error;
    if($error>0)
    {
    switch ($error)
    {
      case 1:
      echo '上传的文件过大,超过服务器限制';
      break;
      case 2:
      echo '上传的文件过大,超过脚本限制';
      break;
      case 3:
      echo '部分文件被上传';
      break;
      case 4:
      echo '上传的文件为0';
      break;
      default:
        break;
    }
    return false;
    }
    else 
    {
      return true;
    }
  }
  private function image_create_shuiyin($image_url)
  {
    $image_info = getimagesize($image_url);
    $image_type = $this->image_type;
    $width = $image_info[0];
    $hieght = $image_info[1];
    
    
    $image = $this->image_createfrom($image_type,$image_url);
    
    
    //$image_create = imagecreatetruecolor($width,$hieght);
    //imagecopy($image_create,$image,0,0,0,0,$width,$hieght);
    $word_color = imagecolorallocate($image,128,128,128);
    $font = "simhei.ttf";
    
    $this->image_box(20,0,$font,$this->image_shuiyin,$image_info);
        imagettftext($image,20,0,$this->image_x,$this->image_y,$word_color,$font,$this->image_shuiyin);
        
        switch ($image_type)
    {
      case 'image/gif':
      header('Content-Type:image/gif');
      imagegif($image);
      imagegif($image,$image_url);
      break;
      case 'image/png':
      header('Content-Type:image/png');
      imagepng($image);
      imagepng($image,$image_url);
      break;
      case 'image/jpeg':
      header('Content-Type:image/jpeg');
      imagejpeg($image);
      imagejpeg($image,$image_url);
      break;
      default:
      break;
    }
    imagedestroy($image);
    //imagedestroy($image);
    
  }
  
    private function shuiyin_suolue($image_url,$name)
  {
    $image_info = getimagesize($image_url);
    $image_type = $this->image_type;
    $width = $image_info[0];
    $hieght = $image_info[1];
    $dir = './image_shuiyin_suolue';
    $suolue_name_url = $dir.'/suolue_'.$name;
    $new_width = $width/2;
    $new_hieght = $hieght/2;
    $size = $this->image_size;
    
    if($this->createdir($dir))
    {
      $image_from = $this->image_createfrom($image_type,$image_url);
      if($size > 100000)
      {
        $new_width = $new_width/5;
        $new_hieght = $new_width/5;
        
      }
      $image_truecolor = imagecreatetruecolor($new_width,$new_hieght);
      imagecopyresized($image_truecolor, $image_from, 0, 0, 0, 0, $new_width, $new_hieght,$width,$hieght);
      
        switch ($image_type)
        {
      case 'image/gif':
      imagegif($image_truecolor,$suolue_name_url);
      break;
      case 'image/png':
      imagepng($image_truecolor,$suolue_name_url);
      break;
      case 'image/jpeg':
      imagejpeg($image_truecolor,$suolue_name_url);
      break;
      default:
      break;
       }
       imagedestroy($image_from);
       imagedestroy($image_truecolor);
    }
    
  }
  private function image_createfrom($image_type,$image_url)
  {
    
      switch ($image_type)
    {
      case 'image/gif':
      $image = imagecreatefromgif($image_url);
      break;
      case 'image/png':
      $image = imagecreatefrompng($image_url);
      break;
      case 'image/jpeg':
      $image = imagecreatefromjpeg($image_url);
      break;
      default:
      break;
    }
    return $image;
  }
  private function image_box($size,$angle,$font,$string,$image_array)
  {
    $box = imagettfbbox($size,$angle,$font,$string);
    $w = $image_array[0];
    $h = $image_array[1];
    
    switch ($this->string_to)
    {
      case 'right_down':
         $this->image_x = ($w-($box[4]-$box[0]));
         $this->image_y = $h-10;
         break;
      case 'right_up':
        $this->image_x = ($w-($box[4]-$box[0]));
        $this->image_y = $box[1]-$box[5];
        break;
    }
    
  }
  
  
  private function createdir($dir)
  {  
    if(!file_exists($dir))
    {
      if(mkdir($dir))
      {
        chmod($dir,0600);
        return true;
      }
      else 
      {
        echo '目录创建失败';
        return false;
      }
    }
    else 
    {
      return true;
    }
  }
  
  private function rename()
  {
    $uniqid = substr(md5(uniqid(rand(1,15))),4,7);
    $image_info = pathinfo($this->image_name);
    $image_extension = $image_info['extension'];
    return $uniqid.'.'.$image_extension;
  }
  private function unlink_tmp()
  {
    if(file_exists($this->image_tmp_name) && is_file($this->image_tmp_name))
    {
      unlink($this->image_tmp_name);
    }
  }
}
?>