上传图片添加水印???
搞了个上传图片的函数(经过测试可以上传图片,这个没有问题)现在想上传图片时添加水印图片(一个小gif)上传图片时,网页提示函数imagecopymerge()报错,不知道哪里出了问题,大家帮我看看
上传图片函数代码:
/*
$files为上传的图片文件
$folder为上传图片的文件夹
*/function uploads($files,$folder)
{
//取得图片的后缀名
$knamearray=explode(".",$_FILES["upfile"]["name"]);
$kname=$knamearray[count($knamearray)-1]; //设置图片文件名为系统时间
$filename=date('YmdHis');
$filenames=$filename.$code.".".$kname;
$upfile=$folder."/".$filenames; //上传图片
move_uploaded_file($files,$upfile); //添加水印图片开始了……
$im=imagecreatefromgif("wimages/logo.gif"); //logo.gif图片的尺寸为120*45
imagecopymerge($upfile,$im,0,0,0,0,120,45,80); //现在提示这句有问题 return $filenames;//回传图片文件名
}

解决方案 »

  1.   

        $im=imagecreatefromgif("wimages/logo.gif"); //logo.gif图片的尺寸为120*45
    最好把路径换成相对的路径;
        imagecopymerge($upfile,$im,0,0,0,0,120,45,80); //现在提示这句有问题
    楼主能不能帮我解释一下imagecopymerge的各个参数的意义啊
      

  2.   

    先确认你的php版本要大于4.01
    imagecopymerge(PHP 4 >= 4.0.1, PHP 5)
    imagecopymerge -- 拷贝并合并图像的一部分
    说明
    int imagecopymerge ( resource dst_im, resource src_im, int dst_x, int dst_y, int src_x, int src_y, int src_w, int src_h, int pct)将 src_im 图像中坐标从 src_x,src_y 开始,宽度为 src_w,高度为 src_h 的一部分拷贝到 dst_im 图像中坐标为 dst_x 和 dst_y 的位置上。两图像将根据 pct 来决定合并程度,其值范围从 0 到 100。当 pct = 0 时,实际上什么也没做,当为 100 时本函数和 imagecopy() 完全一样。 
      

  3.   

    可以这样写: $descrition ="/upload/imag_1123323.jpg";//这个是要加水印图片的路径和文件名; $nimage=imagecreatetruecolor($image_size[0],$image_size[1]);//创建新建一个真彩色图像
                        //$image_size为要加水印的图片大小信息的数组; $simage=imagecreatefromgif($destination); //把要加水印的图片已gif格式读入; imagecopy($nimage,$simage,0,0,0,0,$image_size[0],$image_size[1]);
               //把要加水印的拷贝到创建的真彩色图像上;
     imagedestroy($simage);  //销毁
     $simage1 = imagecreatefromgif("wimages/logo.gif")//  这个路径估计要弄对
                                  //把水印图片读入
     imagecopy($nimage,$simage1,0,0,0,0,85,15);  //把水印也拷贝到上面;
      imagejpeg($nimage,$descrtion);    //把三个图片叠加得到的新图片保存为原来没有水印的图片 imagedestroy($nimage);  //销毁
     imagedestroy($simage);
      

  4.   

    最近我用网上的来修改,弄了一个,做成类,,
    用这个类,可以做出多张图片上传。
    class upimg{  //该类用来实现上传$uptypes数组内类型的图片,可以通过setWaterMark()启用设置水印   /**
        *
        * 则在图片上加水印;
        * 外部通过访问$msg ,$img_width, $img_height ,$save_dir,$img_size变量
        * 获取图片在上传过程中出现的错误,和图片上传后保存的路径,图片大小等信息;
        */
      private $uptypes = array('image/gif','image/jpg','image/jpeg','image/png','image/pjpeg');//'image/bmp','image/x-png');
      private $max_file_size = 200000;
      private $dir_folder = "../imageupload/";
      private $water_ = 1;
      private $water_type = 1;
      private $water_str = "http://www.516ya.cn";
      private $water_img = "xplore.gif";
      private $create_water= false;
      private $overwrite = false;  public $msg="";
      public $img_width=0;
      public $img_height=0;
      public $save_dir="";
      public $img_size=0;
      public $sucess =false;  function setWaterMark(){
        $this->create_water = true;
      }  function startUpload($files){
        if(!is_uploaded_file($files['tmp_name']))
       {
            $this->msg.="图片不存在!--";
           return $this->sucess=false;
        }    if($files['error']!=UPLOAD_ERR_OK){
            $this->msg.="图片上传过程中出现错误";
            return $this->sucess=false;
        }    $file = $files;    if($this->max_file_size<$file['size'])       {
             $this->msg.="你选择的文件大小超过限制--";        return $this->sucess=false;       }    if(!file_exists($this->dir_folder))    {
         mkdir($this->dir_folder);
        }    $file_name = $file['tmp_name'];
        $image_size = getimagesize($file_name);
        $path_info = pathinfo($file['name']);
        $ftype = $path_info['extension'];
        $destination = $this->dir_folder."img_".(double)microtime() * 1000003 * time().".".$ftype;    if(!in_array($file['type'],$this->uptypes)){     $this->msg.="文件类型不正确--";     return $this->sucess=false;
        }    if(file_exists($destination)&& $this->overwrite!=true)    {
         $this->msg.= "有一个同名文件存在--";     return $this->sucess=false;    }
        if(!move_uploaded_file($file_name,$destination))    {
         $this->msg.= "图片从零时文件夹保存到指定文件夹时出错--";     return $this->sucess=false;    }    $pinfo = pathinfo($destination);
        $fname = $pinfo[basename];    $this->save_dir.= $this->dir_folder.$fname."|";
        $this->img_width =$image_size[0];
        $this->img_height =$image_size[1];
        $this->img_size= $file['size']."字节";
        $this->msg.="图片上传成功--";
        $this->sucess = true;  if($this->create_water ==true)
      {
        if($this->water_==1)
        {
            $iinfo=getimagesize($destination);
            $nimage=imagecreatetruecolor($image_size[0],$image_size[1]);
            $white=imagecolorallocate($nimage,255,255,255);
            $black=imagecolorallocate($nimage,0,0,0);
            $red=imagecolorallocate($nimage,255,0,0);
            imagefill($nimage,0,0,$white);        switch($iinfo[2])//根据获取图片的类型,判断采用何种操作
            {
                case 1:
                $simage=imagecreatefromgif($destination);
                break;            case 2:
                $simage=imagecreatefromjpeg($destination);
                break;            case 3:
                $simage=imagecreatefrompng($destination);
                break;            case 6:
                $simage=imagecreatefromwbmp($destination);
                break;            default:
                die("不支持的文件类型");
                exit;
            }        imagecopy($nimage,$simage,0,0,0,0,$image_size[0],$image_size[1]);
            imagefilledrectangle($nimage,$image_size[0]-124,$image_size[1]-17,$image_size[0]-2,$image_size[1]-2,$white);        switch($this->water_type)
            {
                case 1:  //加水印字符串
                imagestring($nimage,2,$image_size[0]-121,$image_size[1]-17,$this->water_str,$black);
                break;            case 2:   //加水印图片
                $simage1=imagecreatefromgif("xplore.gif");
                imagecopy($nimage,$simage1,0,0,0,0,85,15);
                imagedestroy($simage1);
                break;
            }        switch($iinfo[2])
            {
                case 1:
               imagejpeg($nimage,$destination);
                break;            case 2:
                imagejpeg($nimage,$destination);
                break;            case 3:
                imagepng($nimage,$destination);
                break;            case 6:
                imagewbmp($nimage,$destination);
                break;            default:
                die("不支持的文件类型");
                exit;
            }        //覆盖原上传文件
            imagedestroy($nimage);
            imagedestroy($simage);
          }
          $this->success =true;
         }
       }
      }
      

  5.   

    if($_SERVER['REQUEST_METHOD']=='POST')
      {
         $doflag =$_POST['modify']; //判断是新上传的还是修改操作的标志;
          $up = new upimg;
          $up->setWaterMark();
          //$file = $_FILES['upfile'];
        foreach ($_FILES["pictures"]["error"] as $key => $error) {
            $tmp_name = $_FILES["pictures"]["tmp_name"][$key];
            $name = $_FILES["pictures"]["name"][$key];
            $type =$_FILES["pictures"]["type"][$key];
            $size =$_FILES["pictures"]["size"][$key];
            $error =$_FILES["pictures"]["error"][$key];  $file =array("name"=>$name, //该数组的顺序必须保持一致
                    "type"=>$type,
                    "size"=>$size,
                    "tmp_name"=>$tmp_name,
                    "error"=>$error);
         //print_r($file); 调试时用;
           $up->startUpload($file);
     }
    <form enctype = "multipart/form-data" method="POST" name="upform">
    <table><tr><td>图片一:</td><td><input type="file" name="pictures[]"/></td></tr>
         <tr><td>图片二:</td><td><input type="file" name="pictures[]"/></td></tr>
         <tr><td>图片三:</td><td><input type="file" name="pictures[]"/></td></tr>
         <tr><td></td><td><input type="submit" name="submit" value="提交"/>
          <input type="reset" name="reset" value="重置"/>
      

  6.   

    http://cn2.php.net/imagecopymerge第一、第二个参数都要求是资源句柄。不能是图片路径~~
    手册上的例子很清楚~~~就是打水印的~~~<?php
    // Create image instances
    $dest = imagecreatefromgif('php.gif');
    $src = imagecreatefromgif('php.gif');// Copy and merge
    imagecopymerge($dest, $src, 10, 10, 0, 0, 100, 47, 75);// Output and free from memory
    header('Content-Type: image/gif');
    imagegif($dest);imagedestroy($dest);
    imagedestroy($src);
      

  7.   

    问题在这里
    $knamearray=explode(".",$_FILES["upfile"]["name"]);你这是在一个函数里面,$_FILES["upfile"]是空的.如果要使用应该先在函数的开始处加入
    global $_FILES;如下:/*
    $files为上传的图片文件
    $folder为上传图片的文件夹
    */function uploads($files,$folder)
    {     global $_FILES;    //取得图片的后缀名
        $knamearray=explode(".",$_FILES["upfile"]["name"]);
        $kname=$knamearray[count($knamearray)-1];    //设置图片文件名为系统时间
        $filename=date('YmdHis');
        $filenames=$filename.$code.".".$kname;
        $upfile=$folder."/".$filenames;    //上传图片
        move_uploaded_file($files,$upfile);    //添加水印图片开始了……
        $im=imagecreatefromgif("wimages/logo.gif"); //logo.gif图片的尺寸为120*45
        imagecopymerge($upfile,$im,0,0,0,0,120,45,80); //现在提示这句有问题    return $filenames;//回传图片文件名
    }
      

  8.   

    http://topic.csdn.net/u/20090117/09/f5f5a16c-c4e0-480d-9d16-7f8cae8ff641.html
    这里有个加水印可以的
      

  9.   

    在你源程序上改的,不知道能否解决问题
    function uploads($files,$folder)
    {
        //取得图片的后缀名
        $knamearray=explode(".",$_FILES["upfile"]["name"]);
        $kname=$knamearray[count($knamearray)-1];    //设置图片文件名为系统时间
        $filename=date('YmdHis');
        $filenames=$filename.$code.".".$kname;
        $upfile=$folder."/".$filenames;    //上传图片
        move_uploaded_file($files,$upfile);
        
        //增加部分 start
    $type = image_type_to_extension($upfile);
        if($type == "jpg") $type = "jpeg";
        $image_func = "imagecreatefrom".$type;
        $image = $image_func($upfile);
       //增加部分 end
       
    //添加水印图片开始了……
        $im=imagecreatefromgif("wimages/logo.gif"); //logo.gif图片的尺寸为120*45
        imagecopymerge($image,$im,0,0,0,0,120,45,80); //现在提示这句有问题
        //增加部分 start
    imagedestroy($im);
        
        header("Content-Type: image/".$type);
        $image_new = "image".$type;
        $image_new($image, $upfile);
        imagedestroy($image);
        //增加部分 end
        
        return $filenames;//回传图片文件名
    }
      

  10.   

    不好意思上面写错了:
    上面的$type = image_type_to_extension($upfile);这一行应改为:
    $size = getimagesize($upfile);
    $type = substr(image_type_to_extension($size[2]),1);