PHP实例解析:实现给上传图片加水印图案

来源:互联网 发布:淘宝客服必备知识 编辑:程序博客网 时间:2024/04/29 07:13

用PHP给上传图片加水印的程序是通过判断文件类型建立图形,然后把其复制到原建立的图形上,填充并建立rectangle,以备写入imagestring()或是原已经定好的图像程序当中判断水印类型:一是字符串,另是增加一个图形对象在上面。如果你对PHP的GD库比较熟悉,看懂这篇文章一点都不难了!

/*****************************************************参数说明:$max_file_size : 上传文件大小限制, 单位BYTE$destination_folder : 上传文件路径$watermark : 是否附加水印(1为加水印,其他为不加水印);使用说明:1. 将PHP.INI文件里面的"extension=php_gd2.dll"一行前面的;号去掉,因为我们要用到GD库;2. 将extension_dir =改为你的php_gd2.dll所在目录;3. http://www.knowsky.com/php.asp;****************************************************///上传文件类型列表 $uptypes=array('image/jpg','image/jpeg','image/png','image/pjpeg','image/gif','image/bmp','image/x-png');$max_file_size=2000000; //上传文件大小限制, 单位BYTE $destination_folder="uploadimg/"; //上传文件路径 $watermark=1; //是否附加水印(1为加水印,其他为不加水印); $watertype=1; //水印类型(1为文字,2为图片) $waterposition=1; //水印位置(1为左下角,2为右下角,3为左上角,4为右上角,5为居中); $waterstring="http://www.xplore.cn/"; //水印字符串 $waterimg="xplore.gif"; //水印图片 $imgpreview=1; //是否生成预览图(1为生成,其他为不生成); $imgpreviewsize=1/2; //缩略图比例 ?>

<html><head><title>ZwelL图片上传程序</title><style type="text/css"><!--body{font-size: 9pt;}input{background-color: #66CCFF;border: 1px inset #CCCCCC;}--></style></head><body><form enctype="multipart/form-data" method="post" name="upform">上传文件:<input name="upfile" type="file"><input type="submit" value="上传"><br>允许上传的文件类型为:<?=implode(', ',$uptypes)?></form><?phpif ($_SERVER['REQUEST_METHOD'] == 'POST'){if (!is_uploaded_file($_FILES["upfile"][tmp_name]))//是否存在文件     {echo "图片不存在!";exit;}$file = $_FILES["upfile"];if($max_file_size < $file["size"])//检查文件大小     {echo "文件太大!";exit;}if(!in_array($file["type"], $uptypes))//检查文件类型     {echo "文件类型不符!".$file["type"];exit;}if(!file_exists($destination_folder)){mkdir($destination_folder);}$filename=$file["tmp_name"];$image_size = getimagesize($filename);$pinfo=pathinfo($file["name"]);$ftype=$pinfo['extension'];$destination = $destination_folder.time().".".$ftype;if (file_exists($destination) && $overwrite != true){echo "同名文件已经存在了";exit;}if(!move_uploaded_file ($filename, $destination)){echo "移动文件出错";exit;}$pinfo=pathinfo($destination);$fname=$pinfo[basename];echo " <font color=red>已经成功上传</font><br>文件名:  <font color=blue>".$destination_folder.$fname."</font><br>";     echo " 宽度:".$image_size[0];echo " 长度:".$image_size[1];echo "<br> 大小:".$file["size"]." bytes";if($watermark==1){$iinfo=getimagesize($destination,$iinfo);$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,1,$image_size[1]-15,80,$image_size[1],$white);switch($watertype){case 1:   //加水印字符串             imagestring($nimage,2,3,$image_size[1]-15,$waterstring,$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://imagegif($nimage, $destination);             imagejpeg($nimage, $destination);break;case 2:imagejpeg($nimage, $destination);break;case 3:imagepng($nimage, $destination);break;case 6:imagewbmp($nimage, $destination);//imagejpeg($nimage, $destination);             break;}//覆盖原上传文件         imagedestroy($nimage);imagedestroy($simage);}if($imgpreview==1){echo "<br>图片预览:<br>";echo "<ccid_file values="\" width=".($image_size[0]*$imgpreviewsize)."height=".($image_size[1]*$imgpreviewsize);"echo " alt=\"图片预览:\r文件名:".$destination."\r上传时间:\" />";}}?></body></html>

下面这个函数是可以用于加水印的

/** * 图片加水印(适用于png/jpg/gif格式) * * @author flynetcn * * @param $srcImg 原图片 * @param $waterImg 水印图片 * @param $savepath 保存路径 * @param $savename 保存名字 * @param $positon 水印位置 * 1:顶部居左, 2:顶部居右, 3:居中, 4:底部局左, 5:底部居右 * @param $alpha 透明度 -- 0:完全透明, 100:完全不透明 * * @return 成功 -- 加水印后的新图片地址 *          失败 -- -1:原文件不存在, -2:水印图片不存在, -3:原文件图像对象建立失败 *          -4:水印文件图像对象建立失败 -5:加水印后的新图片保存失败 */function img_water_mark($srcImg, $waterImg, $savepath=null, $savename=null, $positon=5, $alpha=30, $disconce = 10){    $temp = pathinfo($srcImg);    $name = $temp['basename'];    $path = $temp['dirname'];    $exte = $temp['extension'];    $savename = $savename ? $savename : $name;    $savepath = $savepath ? $savepath : $path;    $savefile = $savepath .'/'. $savename;    $srcinfo = @getimagesize($srcImg);    if (!$srcinfo) {        return -1; //原文件不存在    }    $waterinfo = @getimagesize($waterImg);    if (!$waterinfo) {        return -2; //水印图片不存在    }    $srcImgObj = image_create_from_ext($srcImg);    if (!$srcImgObj) {        return -3; //原文件图像对象建立失败    }    $waterImgObj = image_create_from_ext($waterImg);    if (!$waterImgObj) {        return -4; //水印文件图像对象建立失败    }    switch ($positon) {//1顶部居左case 1: $x=$y=0; break;//2顶部居右case 2: $x = $srcinfo[0]-$waterinfo[0]; $y = 0; break;//3居中case 3: $x = ($srcinfo[0]-$waterinfo[0])/2; $y = ($srcinfo[1]-$waterinfo[1])/2; break;//4底部居左case 4: $x = 0; $y = $srcinfo[1]-$waterinfo[1]; break;//5底部居右case 5: $x = $srcinfo[0]-$waterinfo[0]; $y = $srcinfo[1]-$waterinfo[1]; break;default: $x=$y=0;    }    imagecopy($srcImgObj, $waterImgObj, $x-$disconce, $y-$disconce, 0, 0, $waterinfo[0], $waterinfo[1]);    switch ($srcinfo[2]) {case 1: imagegif($srcImgObj, $savefile); break;case 2: imagejpeg($srcImgObj, $savefile); break;case 3: imagepng($srcImgObj, $savefile); break;default: return -5; //保存失败    }    imagedestroy($srcImgObj);    imagedestroy($waterImgObj);    return $savefile;}

测试上方函数

$srcImg = 'F:\workprj\trunk\data\static\images\bner_0827.jpg';$waterImg = 'F:\workprj\trunk\data\static\images\close.png'; echo 4545;$a = img_water_mark($srcImg, $waterImg,'F:\workprj','test.png');var_dump($a);


0 0