开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 3639|回复: 7
收起左侧

[PHP相关教程] PHP实现给上传图片加水印图案的做法

[复制链接]

结帖率:100% (11/11)
发表于 2013-8-2 14:55:19 | 显示全部楼层 |阅读模式   河北省衡水市
本帖最后由 小白兔° 于 2013-8-2 15:30 编辑

为了美观,往后代码发成这样。
  1. <form action="<?=$_SERVER['PHP_SELF']?>" method="post" enctype="multipart/form-data" name="form1" id="form1"> <table width="486" border="0" align="center" cellpadding="0" cellspacing="0">
  2.   <tr>
  3.    <td width="498" height="28" background="image/top.gif"><div align="center" class="style2">上传图片</div></td>
  4.   </tr>
  5.   <tr>
  6.    <td> </td>
  7.   </tr>
  8.   <tr>
  9.    <td><div align="right">
  10.     <table width="426" border="0" align="center" cellpadding="0" cellspacing="0">
  11.      <tr>
  12.       <td width="50" height="32" nowrap="nowrap">路径:</td>
  13.       <td width="362"><input name="upfile" type="file" id="upfile" size="40" /></td>
  14.      </tr>

  15.      <tr>
  16.       <td height="27" colspan="2"><div align="center">
  17.         <input type="submit" name="Submit" value="提交" />
  18.   
  19. <input type="reset" name="Submit" value="重置" />
  20. </div></td>
  21.      </tr>
  22.     </table>
  23.      </div>
  24.     <div align="center"></div></td>
  25.   </tr>
  26.   <tr>
  27.    <td> </td>
  28.   </tr><INPUT TYPE="hidden" name='action' value='doup'>
  29.   <tr>
  30.    <td height="28" background="image/top.gif"> </td>
  31.   </tr>
  32.   <tr>
  33.    <td> </td>
  34.   </tr>
  35.  </table>
  36. </form>
  37. <br>
  38. <A href=http://www.bianceng.cn target=_blank></A>
  39. <?
  40. if($_POST['action']=='doup')
  41. {
  42. $uptypes=array('image/jpg','image/jpeg','image/pjpeg','image/gif');//上传图片文件类型列表
  43. $wFile=$_FILES['upfile'];//取得文件路径
  44. $waterimg="water.gif";//水印图片路径
  45. //print_r($wFile);
  46. if(in_array($wFile['type'], $uptypes))
  47. {//检查文件类型,若上传的文件为jpg或gif图片则加水印
  48.   if(strstr($wFile['type'],"jp"))
  49.   { //若上传图片类型为jpg,pjpeg,jpeg,则用imagecreatefromjpeg读取目标文件
  50.   $im = imageCreatefromjpeg($wFile['tmp_name']);
  51. $wfilew=imagesx($im);//取得图片的宽
  52. $wfileh=imagesy($im);//取得图片的高
  53.   }
  54.   else
  55.   {//否则若上传图片类型为gif,则用imagecreatefromgif读取目标文件
  56.   $im = imageCreatefromgif($wFile['tmp_name']);
  57. $wfilew=imagesx($im);//取得图片的宽
  58. $wfileh=imagesy($im);//取得图片的高
  59. }
  60.   //设定混合模式
  61.   imagealphablending($im, true);
  62.   //读取水印文件
  63.   $im2 = imagecreatefrompng($waterimg);//若水印图片为jpg,则此去可改为$im2 = imagecreatefromjpeg($waterimg)
  64. //$white = imagecolorallocate($im2, 255, 255, 255);
  65.  // imagecolortransparent($im2,$white);  //设透明色,这两句可不要
  66. $waterw=imagesx($im2);//取得水印图片的宽
  67. $waterh=imagesy($im2);//取得水印图片的高
  68.   //随机放水印到图片中
  69. $randval = rand(0,9);//在0-9之间产生随机数
  70. if($randval==0||$randval==3||$randval==2||$randval==8||$randval==7){//此处还可完善放更多位置
  71. $wimgx=5;$wimgy=5;//放左上角
  72. }else{
  73. $wimgx=$wfilew-5-$waterw;$wimgy=$wfileh-5-$waterh;//放右上角
  74. }
  75. //拷贝水印到目标文件
  76. imagecopy($im, $im2, $wimgx, $wimgy, 0, 0, $waterw,$waterh);

  77. //输出图片
  78.   if(strstr($wFile['type'],"jp")){ //同上
  79. imagejpeg($im,$wFile['tmp_name']);
  80. }else{
  81. imagegif($im,$wFile['tmp_name']);
  82. }
  83.   imagedestroy($im);
  84.   imagedestroy($im2);
  85. copy($wFile['tmp_name'],$wFile['name']); //上传
  86. }
  87. else echo "图片不符合!!";
  88. }
  89. ?>
复制代码

结帖率:100% (11/11)
 楼主| 发表于 2013-8-2 15:29:13 | 显示全部楼层   河北省衡水市

老大这个代码方式怎么发的
回复 支持 反对

使用道具 举报

结帖率:67% (16/24)
发表于 2013-8-2 15:22:35 | 显示全部楼层   广东省深圳市
  1. <?php
  2.         /**
  3.                 file: image.class.php 类名为Image
  4.                 图像处理类,可以完成对各种类型的图像进行缩放、加图片水印和剪裁的操作。
  5.         */
  6.         class Image {
  7.                 /* 图片保存的路径 */
  8.                 private $path;                                  

  9.                 /**
  10.                  * 实例图像对象时传递图像的一个路径,默认值是当前目录
  11.                  * @param        string        $path        可以指定处理图片的路径
  12.                  */
  13.                 function __construct($path="./"){
  14.                         $this->path = rtrim($path,"/")."/";
  15.                 }
  16.                
  17.                 /**
  18.                  * 对指定的图像进行缩放
  19.                  * @param        string        $name        是需要处理的图片名称
  20.                  * @param        int        $width                缩放后的宽度
  21.                  * @param        int        $height                缩放后的高度
  22.                  * @param        string        $qz                是新图片的前缀
  23.                  * @return        mixed                        是缩放后的图片名称,失败返回false;
  24.                  */
  25.                 function thumb($name, $width, $height,$qz="th_"){
  26.                         /* 获取图片宽度、高度、及类型信息 */
  27.                         $imgInfo = $this->getInfo($name);                                 
  28.                         /* 获取背景图片的资源  */
  29.                         $srcImg = $this->getImg($name, $imgInfo);                          
  30.                         /* 获取新图片尺寸 */
  31.                         $size = $this->getNewSize($name,$width, $height,$imgInfo);      
  32.                         /* 获取新的图片资源 */
  33.                         $newImg = $this->kidOfImage($srcImg, $size,$imgInfo);   
  34.                         /* 通过本类的私有方法,保存缩略图并返回新缩略图的名称,以"th_"为前缀 */
  35.                         return $this->createNewImage($newImg, $qz.$name,$imgInfo);   
  36.                 }
  37.                
  38.                 /**
  39.                 * 为图片添加水印
  40.                 * @param        string        $groundName        背景图片,即需要加水印的图片,暂只支持GIF,JPG,PNG格式
  41.                 * @param        string        $waterName        图片水印,即作为水印的图片,暂只支持GIF,JPG,PNG格式
  42.                 * @param        int        $waterPos                水印位置,有10种状态,0为随机位置;
  43.                 *                                                                 1为顶端居左,2为顶端居中,3为顶端居右;
  44.                 *                                                                 4为中部居左,5为中部居中,6为中部居右;
  45.                 *                                                                7为底端居左,8为底端居中,9为底端居右;
  46.                 * @param        string        $qz                        加水印后的图片的文件名在原文件名前面加上这个前缀
  47.                 * @return        mixed                                是生成水印后的图片名称,失败返回false
  48.                 */
  49.                 function waterMark($groundName, $waterName, $waterPos=0, $qz="wa_"){
  50.                         /*获取水印图片是当前路径,还是指定了路径*/
  51.                         $curpath = rtrim($this->path,"/")."/";
  52.                         $dir = dirname($waterName);
  53.                         if($dir == "."){
  54.                                 $wpath = $curpath;
  55.                         }else{
  56.                                 $wpath = $dir."/";
  57.                                 $waterName = basename($waterName);
  58.                         }
  59.                        
  60.                         /*水印图片和背景图片必须都要存在*/
  61.                         if(file_exists($curpath.$groundName) && file_exists($wpath.$waterName)){
  62.                                 $groundInfo = $this->getInfo($groundName);                          //获取背景信息
  63.                                 $waterInfo = $this->getInfo($waterName, $dir);                     //获取水印图片信息
  64.                                 /*如果背景比水印图片还小,就会被水印全部盖住*/
  65.                                 if(!$pos = $this->position($groundInfo, $waterInfo, $waterPos)){
  66.                                         echo '水印不应该比背景图片小!';
  67.                                         return false;
  68.                                 }

  69.                                 $groundImg = $this->getImg($groundName, $groundInfo);    //获取背景图像资源
  70.                                 $waterImg = $this->getImg($waterName, $waterInfo, $dir); //获取水印图片资源       
  71.                                
  72.                                 /* 调用私有方法将水印图像按指定位置复制到背景图片中 */
  73.                                 $groundImg = $this->copyImage($groundImg, $waterImg, $pos, $waterInfo);
  74.                                 /* 通过本类的私有方法,保存加水图片并返回新图片的名称,默认以"wa_"为前缀 */
  75.                                 return $this->createNewImage($groundImg, $qz.$groundName, $groundInfo);
  76.                                
  77.                         }else{
  78.                                 echo '图片或水印图片不存在!';
  79.                                 return false;
  80.                         }
  81.                 }
  82.                
  83.                 /**
  84.                 * 在一个大的背景图片中剪裁出指定区域的图片
  85.                 * @param        string        $name        需要剪切的背景图片
  86.                 * @param        int        $x                        剪切图片左边开始的位置
  87.                 * @param        int        $y                        剪切图片顶部开始的位置
  88.                 * @param        int        $width                图片剪裁的宽度
  89.                 * @param        int        $height                图片剪裁的高度
  90.                 * @param        string        $qz                新图片的名称前缀
  91.                 * @return        mixed                        裁剪后的图片名称,失败返回false;
  92.                 */
  93.                 function cut($name, $x, $y, $width, $height, $qz="cu_"){
  94.                         $imgInfo=$this->getInfo($name);                 //获取图片信息
  95.                         /* 裁剪的位置不能超出背景图片范围 */
  96.                         if( (($x+$width) > $imgInfo['width']) || (($y+$height) > $imgInfo['height'])){
  97.                                 echo "裁剪的位置超出了背景图片范围!";
  98.                                 return false;
  99.                         }
  100.                        
  101.                         $back = $this->getImg($name, $imgInfo);         //获取图片资源      
  102.                         /* 创建一个可以保存裁剪后图片的资源 */
  103.                         $cutimg = imagecreatetruecolor($width, $height);
  104.                         /* 使用imagecopyresampled()函数对图片进行裁剪 */
  105.                         imagecopyresampled($cutimg, $back, 0, 0, $x, $y, $width, $height, $width, $height);
  106.                         imagedestroy($back);
  107.                         /* 通过本类的私有方法,保存剪切图并返回新图片的名称,默认以"cu_"为前缀 */
  108.                         return $this->createNewImage($cutimg, $qz.$name,$imgInfo);   
  109.                 }

  110.                 /* 内部使用的私有方法,用来确定水印图片的位置 */
  111.                 private function position($groundInfo, $waterInfo, $waterPos){
  112.                         /* 需要加水印的图片的长度或宽度比水印还小,无法生成水印 */
  113.                         if( ($groundInfo["width"]<$waterInfo["width"]) || ($groundInfo["height"]<$waterInfo["height"]) ) {
  114.                                 return false;
  115.                         }
  116.                         switch($waterPos) {
  117.                                 case 1:                        //1为顶端居左
  118.                                         $posX = 0;
  119.                                         $posY = 0;
  120.                                         break;
  121.                                 case 2:                        //2为顶端居中
  122.                                         $posX = ($groundInfo["width"] - $waterInfo["width"]) / 2;
  123.                                         $posY = 0;
  124.                                         break;
  125.                                 case 3:                        //3为顶端居右
  126.                                         $posX = $groundInfo["width"] - $waterInfo["width"];
  127.                                         $posY = 0;
  128.                                         break;
  129.                                 case 4:                        //4为中部居左
  130.                                         $posX = 0;
  131.                                         $posY = ($groundInfo["height"] - $waterInfo["height"]) / 2;
  132.                                         break;
  133.                                 case 5:                        //5为中部居中
  134.                                         $posX = ($groundInfo["width"] - $waterInfo["width"]) / 2;
  135.                                         $posY = ($groundInfo["height"] - $waterInfo["height"]) / 2;
  136.                                         break;
  137.                                 case 6:                        //6为中部居右
  138.                                         $posX = $groundInfo["width"] - $waterInfo["width"];
  139.                                         $posY = ($groundInfo["height"] - $waterInfo["height"]) / 2;
  140.                                         break;
  141.                                 case 7:                        //7为底端居左
  142.                                         $posX = 0;
  143.                                         $posY = $groundInfo["height"] - $waterInfo["height"];
  144.                                         break;
  145.                                 case 8:                        //8为底端居中
  146.                                         $posX = ($groundInfo["width"] - $waterInfo["width"]) / 2;
  147.                                         $posY = $groundInfo["height"] - $waterInfo["height"];
  148.                                         break;
  149.                                 case 9:                        //9为底端居右
  150.                                         $posX = $groundInfo["width"] - $waterInfo["width"];
  151.                                         $posY = $groundInfo["height"] - $waterInfo["height"];
  152.                                         break;
  153.                                 case 0:
  154.                                 default:                //随机
  155.                                         $posX = rand(0,($groundInfo["width"] - $waterInfo["width"]));
  156.                                         $posY = rand(0,($groundInfo["height"] - $waterInfo["height"]));
  157.                                         break;
  158.                         }
  159.                         return array("posX"=>$posX, "posY"=>$posY);
  160.                 }

  161.                
  162.                 /* 内部使用的私有方法,用于获取图片的属性信息(宽度、高度和类型) */
  163.                 private function getInfo($name, $path=".") {
  164.                         $spath = $path=="." ? rtrim($this->path,"/")."/" : $path.'/';
  165.                        
  166.                         $data = getimagesize($spath.$name);
  167.                         $imgInfo["width"]        = $data[0];
  168.                         $imgInfo["height"]  = $data[1];
  169.                         $imgInfo["type"]        = $data[2];

  170.                         return $imgInfo;               
  171.                 }

  172.                 /*内部使用的私有方法, 用于创建支持各种图片格式(jpg,gif,png三种)资源  */
  173.                 private function getImg($name, $imgInfo, $path='.'){
  174.                        
  175.                         $spath = $path=="." ? rtrim($this->path,"/")."/" : $path.'/';
  176.                         $srcPic = $spath.$name;
  177.                        
  178.                         switch ($imgInfo["type"]) {
  179.                                 case 1:                                        //gif
  180.                                         $img = imagecreatefromgif($srcPic);
  181.                                         break;
  182.                                 case 2:                                        //jpg
  183.                                         $img = imagecreatefromjpeg($srcPic);
  184.                                         break;
  185.                                 case 3:                                        //png
  186.                                         $img = imagecreatefrompng($srcPic);
  187.                                         break;
  188.                                 default:
  189.                                         return false;
  190.                                         break;
  191.                         }
  192.                         return $img;
  193.                 }
  194.                
  195.                 /* 内部使用的私有方法,返回等比例缩放的图片宽度和高度,如果原图比缩放后的还小保持不变 */
  196.                 private function getNewSize($name, $width, $height, $imgInfo){       
  197.                         $size["width"] = $imgInfo["width"];          //原图片的宽度
  198.                         $size["height"] = $imgInfo["height"];        //原图片的高度
  199.                        
  200.                         if($width < $imgInfo["width"]){
  201.                                 $size["width"]=$width;                              //缩放的宽度如果比原图小才重新设置宽度
  202.                         }

  203.                         if($height < $imgInfo["height"]){
  204.                                 $size["height"] = $height;                     //缩放的高度如果比原图小才重新设置高度
  205.                         }
  206.                         /* 等比例缩放的算法 */
  207.                         if($imgInfo["width"]*$size["width"] > $imgInfo["height"] * $size["height"]){
  208.                                 $size["height"] = round($imgInfo["height"]*$size["width"]/$imgInfo["width"]);
  209.                         }else{
  210.                                 $size["width"] = round($imgInfo["width"]*$size["height"]/$imgInfo["height"]);
  211.                         }
  212.                        
  213.                         return $size;
  214.                 }       
  215.                
  216.                 /* 内部使用的私有方法,用于保存图像,并保留原有图片格式 */
  217.                 private function createNewImage($newImg, $newName, $imgInfo){
  218.                         $this->path = rtrim($this->path,"/")."/";
  219.                         switch ($imgInfo["type"]) {
  220.                                    case 1:                                //gif
  221.                                         $result = imageGIF($newImg, $this->path.$newName);
  222.                                         break;
  223.                                 case 2:                                //jpg
  224.                                         $result = imageJPEG($newImg,$this->path.$newName);  
  225.                                         break;
  226.                                 case 3:                                //png
  227.                                         $result = imagePng($newImg, $this->path.$newName);  
  228.                                         break;
  229.                         }
  230.                         imagedestroy($newImg);
  231.                         return $newName;
  232.                 }

  233.                 /* 内部使用的私有方法,用于加水印时复制图像 */
  234.                 private function copyImage($groundImg, $waterImg, $pos, $waterInfo){
  235.                         imagecopy($groundImg, $waterImg, $pos["posX"], $pos["posY"], 0, 0, $waterInfo["width"],$waterInfo["height"]);
  236.                         imagedestroy($waterImg);
  237.                         return $groundImg;
  238.                 }

  239.                 /* 内部使用的私有方法,处理带有透明度的图片保持原样 */
  240.                 private function kidOfImage($srcImg, $size, $imgInfo){
  241.                         $newImg = imagecreatetruecolor($size["width"], $size["height"]);               
  242.                         $otsc = imagecolortransparent($srcImg);                                       
  243.                         if( $otsc >= 0 && $otsc < imagecolorstotal($srcImg)) {                 
  244.                                    $transparentcolor = imagecolorsforindex( $srcImg, $otsc );
  245.                                   $newtransparentcolor = imagecolorallocate(
  246.                                             $newImg,
  247.                                            $transparentcolor['red'],
  248.                                             $transparentcolor['green'],
  249.                                             $transparentcolor['blue']
  250.                                    );
  251.                                    imagefill( $newImg, 0, 0, $newtransparentcolor );
  252.                                    imagecolortransparent( $newImg, $newtransparentcolor );
  253.                         }
  254.                         imagecopyresized( $newImg, $srcImg, 0, 0, 0, 0, $size["width"], $size["height"], $imgInfo["width"], $imgInfo["height"] );
  255.                         imagedestroy($srcImg);
  256.                         return $newImg;
  257.                 }
  258.         }

  259.        
  260.        
  261.        
复制代码
使用方法
  1. <?php
  2.         /* 加载图像处理类所在的文件 */
  3.         include "image.class.php";
  4.         /* 实例化图像处理类对象,通过构造方法的参数指定图片所在路径 */
  5.         $img = new Image('./image/');
  6.        
  7.         /* 将上传到服务器的大图控制在500X500以内,最后一个参数使用了'',将原来图片覆盖 */
  8.         $filename = $img -> thumb("brophp.jpg", 500, 500, '');       
  9.        
  10.         /* 另存为一张250X250的中图,返回的图片名称会默认加上th_前缀 */
  11.         $midname = $img -> thumb($filename, 250,250);
  12.         /* 另存为一张80X80的小图标,返回的图片名称前使用指定的icon_作为前缀 */
  13.         $icon = $img -> thumb($filename, 80, 80, 'icon_');
  14.        
  15.         echo $filename.'<br>';     //缩放成功输出brophp.jpg
  16.         echo $midname.'<br>';      //缩放成功输出th_brophp.jpg
  17.         echo $icon.'<br>';         //缩放成功输出icon_brophp.jpg
复制代码
回复 支持 反对

使用道具 举报

结帖率:90% (9/10)
发表于 2013-8-2 15:08:46 | 显示全部楼层   广东省佛山市
尼玛,这次我面对这么多的abc我竟然看懂了。。。

点评

当然 我发的源码 无论是C++还是PHP 都是精挑细选的   河北省衡水市  发表于 2013-8-2 15:10
回复 支持 反对

使用道具 举报

结帖率:100% (3/3)

签到天数: 12 天

发表于 2013-8-2 15:00:42 | 显示全部楼层   广东省揭阳市
帖子内容太水了,居然不放到引用代码里面,这样看起来非常不直观

点评

多谢老大提醒   河北省衡水市  发表于 2013-8-2 15:11
回复 支持 反对

使用道具 举报

结帖率:57% (13/23)
发表于 2013-8-2 15:00:17 | 显示全部楼层   广东省惠州市
我来看星星的,话说大白天的
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
网站简介:精易论坛成立于2009年,是一个程序设计学习交流技术论坛,隶属于揭阳市揭东区精易科技有限公司所有。
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表