赞
踩
在我们的日常生活中,为了不希望自己的图片被盗用,经常能够看到在一些图片上添加水印,比如我们网站上,输入图片文件的话会自动在右下角加上一个水印,那么这种水印效果是怎么实现的呢?通过PHP就可以实现为图片增加水印的效果。
在之前文章中对图片进行裁剪放到目标图上的操作和添加水印有些类似,为了实现添加水印,需要通过 imagecopymerge函数。
imagecopymerge
函数
imagecopymerge函数的语法格式如下:
imagecopymerge($目标图片,$来源图片,$目标开始的x ,$目标开始的y,$来源的x ,$来源的y ,$来源的宽 ,$来源的高 ,$透明度)
其中透明度的值是0-100的整数,透明度的值越大,水印越不透明。
接下来我们通过实例来看一下应该怎样给图片增加水印:
首先准备了一个名为test.png的图片和一个名为logo.png的水印图片放到了我们的根目录里
注意上面这个是示例图片,下面的水印并不是我添加的,是网站自动添加的,为了区分,实例的水印是下面这样的
那接下来,操作如下:
- <?php
-
- //打开目标图片
-
- $dst = imagecreatefrompng('test.png');
-
- //打开Logo来源图片
-
- $src = imagecreatefrompng('logo.png');
-
- //得到目标图片的宽高
-
- $dst_info = getimagesize('test.png');
-
- //得到logo图片的宽高
-
- $src_info = getimagesize('logo.png');
-
- //放到最右下脚可得出图片水印图片需要开始的位置即:
-
- //x点位置:需要大图的宽 - 小图的宽;
-
- //y点位置:放大图的高 - 小图的高
-
- $dst_x = $dst_info[0] - $src_info[0];
-
- $dst_y = $dst_info[1] - $src_info[1];
-
- //要将图片加在右下脚
-
- imagecopymerge($dst, $src, $dst_x, $dst_y, 0, 0, $src_info[0], $src_info[1], 50);
-
- header('Content-type:image/png');
-
- imagepng($dst);
-
- imagedestroy($dst);
-
- imagedestroy($src);
-
- ?>
-
- 输出结果:

由上述结果可以看出,通过imagecopymerge函数添加了一个透明度为50的水印。
拓展知识imagecopy
函数
不止使用imagecopymerge函数一种方法添加水印,也能够通过 imagecopy()
函数,它能够复制函数的一部分,它的语法格式如下:
imagecopy($目标图片, $来源图片,$目标图片x,$目标图片y,$来源图片x,$来源图片y,$来源图片宽,$来源图片高)
它的含义是,在来源图片的(x,y)的地方选取宽为w,高为h的矩形区域到目标图片的(x,y)上。
使用 PHP 中的 imagesx()、imagesy() 两个函数来分别获取图片的宽度和高度。它们的语法格式如下:
- imagesx(resource $image)
-
- imagesy(resource $image)
实例如下:
- <?php
-
- function watermark($img, $watermark, $district = 0,$watermarkquality = 95){
-
- $imginfo = @getimagesize($img);
-
- $watermarkinfo = @getimagesize($watermark);
-
- $img_w = $imginfo[0];
-
- $img_h = $imginfo[1];
-
- $watermark_w = $watermarkinfo[0];
-
- $watermark_h = $watermarkinfo[1];
-
- if($district == 0) $district = rand(1,9);
-
- if(!is_int($district) OR 1 > $district OR $district > 9) $district = 9;
-
- switch($district){
-
- case 1:
-
- $x = +5;
-
- $y = +5;
-
- break;
-
- case 2:
-
- $x = ($img_w - $watermark_w) / 2;
-
- $y = +5;
-
- break;
-
- case 3:
-
- $x = $img_w - $watermark_w - 5;
-
- $y = +5;
-
- break;
-
- case 4:
-
- $x = +5;
-
- $y = ($img_h - $watermark_h) / 2;
-
- break;
-
- case 5:
-
- $x = ($img_w - $watermark_w) / 2;
-
- $y = ($img_h - $watermark_h) / 2;
-
- break;
-
- case 6:
-
- $x = $img_w - $watermark_w;
-
- $y = ($img_h - $watermark_h) / 2;
-
- break;
-
- case 7:
-
- $x = +5;
-
- $y = $img_h - $watermark_h - 5;
-
- break;
-
- case 8:
-
- $x = ($img_w - $watermark_w) / 2;
-
- $y = $img_h - $watermark_h - 5;
-
- break;
-
- case 9:
-
- $x = $img_w - $watermark_w - 5;
-
- $y = $img_h - $watermark_h - 5;
-
- break;
-
- }
-
- switch ($imginfo[2]) {
-
- case 1:
-
- $im = @imagecreatefromgif($img);
-
- break;
-
- case 2:
-
- $im = @imagecreatefromjpeg($img);
-
- break;
-
- case 3:
-
- $im = @imagecreatefrompng($img);
-
- break;
-
- }
-
- switch ($watermarkinfo[2]) {
-
- case 1:
-
- $watermark_logo = @imagecreatefromgif($watermark);
-
- break;
-
- case 2:
-
- $watermark_logo = @imagecreatefromjpeg($watermark);
-
- break;
-
- case 3:
-
- $watermark_logo = @imagecreatefrompng($watermark);
-
- break;
-
- }
-
- if(!$im or !$watermark_logo) return false;
-
- $dim = @imagecreatetruecolor($img_w, $img_h);
-
- if(@imagecopy($dim, $im, 0, 0, 0, 0,$img_w,$img_h )){
-
- imagecopy($dim, $watermark_logo, $x, $y, 0, 0, $watermark_w, $watermark_h);
-
- }
-
- $file = dirname($img) . '/w' . basename($img);
-
- $result = imagejpeg ($dim,$file,$watermarkquality);
-
- imagedestroy($watermark_logo);
-
- imagedestroy($dim);
-
- imagedestroy($im);
-
- if($result){
-
- echo $img.' 水印添加成功';
-
- return;
-
- }
-
- else {
-
- return false;
-
- }
-
- }
-
- $file = 'test.png'; //待加水印的图片地址
-
- $water = 'logo.png'; //水印图片的地址
-
- watermark($file, $water);
-
- ?>

输出结果:
效果如下: