孤独求学人
php 为图片添加水印
2011-7-7 杜世伟

今天花了一点时间研究了php中imagecopymerge函数,这个函数是为图片添加水印的一个函数,我为此写了一个方法为需要的图片添加水 印,希望对你有所帮助,也希望你提出宝贵的意见!

<?php
/*
 * Created on 2011-5-12
 * author 孤独求学人
 */
 function waterMark($srcimg,$waterimg,$savename,$savepath,$position=1,$alpha=20){
     //判断原图片是否存在
     if(!file_exists($srcimg)){
         return "原始图片不存在";
     }
     //判断水印图片是否存在
     if(!file_exists($waterimg)){
         return "水印图片不存在";
     }
     //图像合并程度是0和100之间的数值,既水印的透明度
     if($alpha > 100 || $alpha < 0){
         return "$alpha 必须大于0小于100";
     }
    //获取原始图片的信息
     $temp = pathinfo($srcimg);
     $srcimg_basename = $temp['basename'];
     $srcimg_path = $temp['dirname'];

     $savename = isset($savename) ? $savename : $srcimg_basename;//存储图片的名字
     $savepath = isset($savepath) ? $savepath : $srcimg_path;//图片存储路径

     $savefile = $savepath."/".$savename;//保存文件
     $srcinfo = @getimagesize($srcimg);//获取原始图片的信息
     $waterinfo = @getimagesize($waterimg);//获取水印图片的信息
     //判断水印位置
     switch($position){
         case "1"://顶部居左
             $x=$y=0;
            break;
         case "2"://顶部居右
             $x = $srcinfo[0] - $waterinfo[0];$y=0;
            break;
         case "3"://顶部居中
             $x = ($srcinfo[0] - $waterinfo[0])/2;$y=0;
            break;
         case "4"://图片居中
             $x = ($srcinfo[0] - $waterinfo[0])/2;$y = ($srcinfo[1]-$waterinfo[1])/2;
            break;
         case "5"://底部居左
             $x = 0;$y = $srcinfo[1]-$waterinfo[1];
            break;
         case "6"://底部居中
             $x = ($srcinfo[0] - $waterinfo[0])/2;$y = $srcinfo[1]-$waterinfo[1];
            break;
         case "7"://底部居右
             $x = $srcinfo[0] - $waterinfo[0];$y = $srcinfo[1]-$waterinfo[1];
            break;
         default:
             $x=$y=0;
     }

     $srcImageObj = image_create_image_ext($srcimg);
     if(!$srcImageObj){
         return "原始新建图像失败";
     }

     $waterImageObj = image_create_image_ext($waterimg);
     if(!$waterImageObj){
         return "水印图片新建失败";
     }
    /*
     * 拷贝并合并图像的一部分int imagecopymerge
     * 其值范围从 0 到 100。当 pct = 0 时,实际上什么也没做,当为 100 时本函数和 imagecopy() 完全一样。
     * 参数     说明
     * dst_im     目标图像
     * src_im     被拷贝的源图像
     * dst_x     目标图像开始 x 坐标
     * dst_y     目标图像开始 y 坐标,x,y同为 0 则从左上角开始
     * src_x     拷贝图像开始 x 坐标
     * src_y     拷贝图像开始 y 坐标,x,y同为 0 则从左上角开始拷贝
     * src_w     (从 src_x 开始)拷贝的宽度
     * src_h     (从 src_y 开始)拷贝的高度
     * pct     图像合并程度,取值 0-100 ,当 pct=0 时,实际上什么也没做,反之完全合并。
     * 当为 pct = 100 时对于调色板图像本函数和 imagecopy() 完全一样
     */
     imagecopymerge($srcImageObj,$waterImageObj,$x,$y,0,0,$waterinfo[0],$waterinfo[1],$alpha);
     //判断原始图片的类型
      switch($srcinfo[2]){
         case '1'://以 GIF 格式将图像输出到文件
            imagegif($srcImageObj,$savefile);
            break;
         case '2'://以 JPG 格式将图像输出到文件
            imagejpeg($srcImageObj,$savefile);
            break;
         case '3'://以 PNG 格式将图像输出到文件
            imagepng($srcImageObj,$savefile);
            break;
         default:
            return false;
     }
     //销毁图像
     imagedestroy($srcImageObj);
     imagedestroy($waterImageObj);
     return $savefile;
 }
/*
 * resource imagecreatefromgif ( string filename)
 * imagecreatefromgif() 返回一图像标识符,代表了从给定的文件名取得的图像。
 */
 function image_create_image_ext($filename){
     $info = @getimagesize($filename);
     $im ="";
     switch($info[2]){
         case "1":
             return $im = imagecreatefromgif($filename);
             break;
         case "2":
             return $im = imagecreatefromjpeg($filename);
             break;
         case "3":
             return $im = imagecreatefrompng($filename);
             break;
     }
 }
?>