当前位置:首页 > PHP教程 > php图像处理 > 列表

PHP imagecopy()与imagecopymerge()图像添加水印

发布:smiling 来源: PHP粉丝网  添加日期:2014-08-18 15:17:56 浏览: 评论:0 

图像添加水印在php中有很多种办法可以实现,他这些功能都是基于php中的GD库的,如果没有开户GD库是不可以使用水印功能的.

imagecopymerge() 函数用于拷贝并合并图像的一部分,成功返回 TRUE,否则返回 FALSE .

Windows下开启PHP的GD库支持,找到php.ini,打开内容,找到:;extension=php_gd2.dll,把最前面的分号“;”去掉,再保存即可,如果本来就没有分号,那就是已经开启了.

基本的语法:bool 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 )

参数说明:参数 说明

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() 完全一样,知道了用法,要实现我们的功能就简单了,用下面的代码就可以轻松实现,代码如下:

  1. <?php 
  2. header("Content-type: image/jpeg"); 
  3.  
  4. //原始图像 
  5. $dst = "images/flower_1.jpg"
  6.  
  7. //得到原始图片信息 
  8. $dst_im = imagecreatefromjpeg($dst); 
  9. $dst_info = getimagesize($dst); 
  10.  
  11. //水印图像 
  12. $src = "images/logo.gif"
  13. $src_im = imagecreatefromgif($src); 
  14. $src_info = getimagesize($src); 
  15.  
  16. //水印透明度 
  17. $alpha = 30; 
  18.  
  19. //合并水印图片 
  20. imagecopymerge($dst_im,$src_im,$dst_info[0]-$src_info[0],$dst_info[1]-$src_info[1],0,0,$src_info[0], 
  21. $src_info[1],$alpha); 
  22. //开源代码phpfensi.com 
  23. //输出合并后水印图片 
  24. imagejpeg($dst_im); 
  25. imagedestroy($dst_im); 
  26. imagedestroy($src_im); 
  27. ?> 

新版本之后imagecopymerge函数几乎不使用了,我们可直接使用imagecopy来生成水印两个函数的功能是完全一样的,代码如下:

  1. //增加水印 
  2. $watermark   =1; 
  3. $watertype   =2; 
  4. $waterstring ='';   
  5. $waterimg="z.png";    //水印图片  
  6. $sFilePath ='aa.jpg'
  7. if($watermark==1)  
  8. {  
  9.  $image_size = getimagesize($sFilePath); //上传的图片 
  10.  $water_size = getimagesize($waterimg);  //水印图片 
  11.  $iinfo=getimagesize($sFilePath,$iinfo);  
  12.  $nimage=imagecreatetruecolor($image_size[0],$image_size[1]);  
  13.  $white=imagecolorallocate($nimage,255,255,255);  
  14.  $black=imagecolorallocate($nimage,0,0,0);  
  15.  $red=imagecolorallocate($nimage,255,0,0);  
  16.  imagefill($nimage,0,0,$white);  
  17.  switch ($iinfo[2])  
  18.  {  
  19.   case 1:  
  20.    $simage =imagecreatefromgif($sFilePath);  
  21.    break;  
  22.   case 2:  
  23.    $simage =imagecreatefromjpeg($sFilePath);  
  24.    break;  
  25.   case 3:  
  26.    $simage =imagecreatefrompng($sFilePath);  
  27.    break;  
  28. //            case 6:  
  29. //            $simage =imagecreatefromwbmp($sFilePath);  
  30. //            break;  
  31.   default:  
  32.    die("不支持的文件类型");  
  33.    exit;  
  34.  }  
  35.    
  36.  imagecopy($nimage,$simage,0,0,0,0,$image_size[0],$image_size[1]);  
  37.    
  38.  switch($watertype)  
  39.  {  
  40.   case 1:   //加水印字符串  
  41.    imagestring($nimage,2,3,$image_size[1]-15,$waterstring,$black);  
  42.    break;  
  43.   case 2:   //加水印图片  
  44.    $simage1 =imagecreatefrompng($waterimg);      
  45.    $x$image_size[0]-$water_size[0];  
  46.    $y$image_size[1]-$water_size[1];  
  47.    imagecopy($nimage,$simage1,$x,$y,0,0,240,65);  
  48.    imagedestroy($simage1);  
  49.    break;  
  50.  }  
  51.       
  52.  switch ($iinfo[2])  
  53.  {  
  54.   case 1:  
  55.    imagegif($nimage$sFilePath);  
  56. //            imagejpeg($nimage, $sFilePath);  
  57.    break;  
  58.   case 2:  
  59.    imagejpeg($nimage$sFilePath);  
  60.    break;  
  61.   case 3:  
  62.    imagepng($nimage$sFilePath);  
  63.    break;  
  64. //            case 6:  
  65. //            imagewbmp($nimage, $sFilePath);  
  66. //            //imagejpeg($nimage, $sFilePath);  
  67. //            break;  
  68.  }  
  69.    
  70.  //覆盖原上传文件  
  71.  imagedestroy($nimage);  
  72.  imagedestroy($simage);  

一个更好的功能,可以生成缩略并且还可以给图片添加水印,想操作图片,先得把图片的大小,类型信息得到,水印:就是把指定的水印复制到目标上,并加透明效果,缩略图:就是把大图片复制到小尺寸画面上,代码如下:

  1. class ImageTool {   
  2.     // imageInfo 分析图片的信息   
  3.     // return array()   
  4.     public static function imageInfo($image) {   
  5.         // 判断图片是否存在   
  6.         if (!file_exists($image)) {   
  7.             return false;   
  8.         }   
  9.    
  10.         $info = getimagesize($image);   
  11.    
  12.         if ($info == false) {   
  13.             return false;   
  14.         }   
  15.    
  16.         // 此时info分析出来,是一个数组   
  17.         $img['width'] = $info[0];   
  18.         $img['height'] = $info[1];   
  19.         $img['ext'] = substr($info['mime'], strpos($info['mime'], '/') + 1);   
  20.    
  21.         return $img;   
  22.     }   
  23.    
  24.     /*  
  25.      加水印功能  
  26.      parm String $dst 等操作图片  
  27.      parm String $water 水印小图  
  28.      parm String $save,不填则默认替换原始图  
  29.      */   
  30.     public static function water($dst$water$save = NULL, $pos = 2, $alpha = 50) {   
  31.         // 先保证2个图片存在   
  32.         if (!file_exists($dst) || !file_exists($water)) {   
  33.             return false;   
  34.         }   
  35.    
  36.         // 首先保证水印不能比待操作图片还大   
  37.         $dinfo = self::imageInfo($dst);   
  38.         $winfo = self::imageInfo($water);   
  39.    
  40.         if ($winfo['height'] > $dinfo['height'] || $winfo['width'] > $dinfo['width']) {   
  41.             return false;   
  42.         }   
  43.    
  44.         // 两张图,读到画布上! 但是图片可能是png,可能是jpeg,用什么函数读?   
  45.         $dfunc = 'imagecreatefrom' . $dinfo['ext'];   
  46.         $wfunc = 'imagecreatefrom' . $winfo['ext'];   
  47.    
  48.         if (!function_exists($dfunc) || !function_exists($wfunc)) {   
  49.             return false;   
  50.         }   
  51.    
  52.         // 动态加载函数来创建画布   
  53.         $dim = $dfunc($dst);   
  54.         // 创建待操作的画布   
  55.         $wim = $wfunc($water);   
  56.         // 创建水印画布   
  57.    
  58.         // 根据水印的位置 计算粘贴的坐标   
  59.         switch($pos) {   
  60.             case 0 :   
  61.                 // 左上角   
  62.                 $posx = 0;   
  63.                 $posy = 0;   
  64.                 break;   
  65.    
  66.             case 1 :   
  67.                 // 右上角   
  68.                 $posx = $dinfo['width'] - $winfo['width'];   
  69.                 $posy = 0;   
  70.                 break;   
  71.    
  72.             case 3 :   
  73.                 // 左下角   
  74.                 $posx = 0;   
  75.                 $posy = $dinfo['height'] - $winfo['height'];   
  76.                 break;   
  77.    
  78.             default :   
  79.                 $posx = $dinfo['width'] - $winfo['width'];   
  80.                 $posy = $dinfo['height'] - $winfo['height'];   
  81.         }   
  82.    
  83.         // 加水印   
  84.         imagecopymerge($dim$wim$posx$posy, 0, 0, $winfo['width'], $winfo['height'], $alpha);   
  85.    
  86.         // 保存   
  87.         if (!$save) {   
  88.             $save = $dst;   
  89.             unlink($dst);   
  90.             // 删除原图   
  91.         }   
  92.    
  93.         $createfunc = 'image' . $dinfo['ext'];   
  94.         $createfunc($dim$save);   
  95.    
  96.         imagedestroy($dim);   
  97.         imagedestroy($wim);   
  98.    
  99.         return true;   
  100.     }   
  101.    
  102.     /**  
  103.      thumb 生成缩略图  
  104.      等比例缩放,两边留白  
  105.      **/   
  106.     public static function thumb($dst$save = NULL, $width = 200, $height = 200) {   
  107.         // 首先判断待处理的图片存不存在   
  108.         $dinfo = self::imageInfo($dst);   
  109.         if ($dinfo == false) {   
  110.             return false;   
  111.         }   
  112.    
  113.         // 计算缩放比例   
  114.         $calc = min($width / $dinfo['width'], $height / $dinfo['height']);   
  115.    
  116.         // 创建原始图的画布   
  117.         $dfunc = 'imagecreatefrom' . $dinfo['ext'];   
  118.         $dim = $dfunc($dst);   
  119.    
  120.         // 创建缩略画布   
  121.         $tim = imagecreatetruecolor($width$height);   
  122.    
  123.         // 创建白色填充缩略画布   
  124.         $white = imagecolorallocate($tim, 255, 255, 255);   
  125.    
  126.         // 填充缩略画布   
  127.         imagefill($tim, 0, 0, $white);   
  128.    
  129.         // 复制并缩略   
  130.         $dwidth = (int)$dinfo['width'] * $calc;   
  131.         $dheight = (int)$dinfo['height'] * $calc;   
  132.    
  133.         $paddingx = (int)($width - $dwidth) / 2;   
  134.         $paddingy = (int)($height - $dheight) / 2;   
  135.    
  136.         imagecopyresampled($tim$dim$paddingx$paddingy, 0, 0, $dwidth$dheight$dinfo['width'], 
  137.  
  138. $dinfo['height']);   
  139.    
  140.         // 保存图片   
  141.         if (!$save) {   
  142.             $save = $dst;   
  143.             unlink($dst);   
  144.         }   
  145.    
  146.         $createfunc = 'image' . $dinfo['ext'];   
  147.         $createfunc($tim$save);   
  148.    
  149.         imagedestroy($dim);   
  150.         imagedestroy($tim);   
  151.    
  152.         return true;   
  153.    
  154.     }   
  155.    

Tags: imagecopy imagecopymerge

分享到: