如何通过PHP实现给图像添加水印,方法是什么
Admin 2022-08-26 群英技术资讯 746 次浏览
在实际应用中,我们有时候会遇到“如何通过PHP实现给图像添加水印,方法是什么”这样的问题,我们该怎样来处理呢?下文给大家介绍了解决方法,希望这篇“如何通过PHP实现给图像添加水印,方法是什么”文章能帮助大家解决问题。
在我们的日常生活中,为了不希望自己的图片被盗用,经常能够看到在一些图片上添加水印,比如我们网站上,输入图片文件的话会自动在右下角加上一个水印,那么这种水印效果是怎么实现的呢?通过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);
?>输出结果:

效果如下:

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
这篇文章主要介绍了Laravel5.1 框架Request请求操作常见用法,结合实例形式分析了Laravel5.1 框架Request请求操作常见的属性和方法,及相关操作注意事项,需要的朋友可以参考下
php怎么post换行?在做开发的时候,我们会遇到需要对文本进行换行操作的需求,那么php中取出的值放在文本里怎样实现换行呢?下面小编给大家分享一个post换行的方法,供大家学习参考。
php数组中重置索引:1、array_values 函数并不止重置数字索引还会将字符串键名也同样删除并重置。2、array_slice函数的功能是取出数组的中的一段,但它默认会重新排序并重置数组的数字索引。
在本篇文章里小编给大家整理的是一篇关于php修改word的实例方法,有兴趣的朋友们可以跟着学习参考下。
文本主要给大家分享的是关于php依赖注入容器的内容,对于新手来说依赖注入容器可能比较难理解,文本有对依赖注入容器理解以及具体代码,有这方面学习需要的朋友可以参考参考。下面我们一起来了解一下。
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008