如何通过PHP实现给图像添加水印,方法是什么
Admin 2022-08-26 群英技术资讯 885 次浏览
在实际应用中,我们有时候会遇到“如何通过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进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
在PHP的日常操作中,数组是最常出现的结构,而我们几乎每天都在处理数组相关的内容,这篇文章主要给大家介绍了关于PHP数组迭代器的使用方法,需要的朋友可以参考下
学习PHP,我们需要掌握一些基础语法,其中数据类型是很重要的知识点,那么php数据类型是什么?有哪些呢?下面就跟随小编一起来认识一下吧。
今天小编就为大家分享一篇Laravel框架之解决前端显示图片问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
本篇文章小编给大家分享一下Python避免字典和元组的多重嵌套问题代码示例,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看。
swoole无法运行是因为“swoole”没有安装成功,其解决办法:首先查找“swoole.so”的位置;然后使用命令“sudo vi /etc/php/7.2/cli/php.ini”将swoole添加到配置文件中即可。
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
7x24小时售前:400-678-4567
7x24小时售后:0668-2555666
24小时QQ客服
群英微信公众号
CNNIC域名投诉举报处理平台
服务电话:010-58813000
服务邮箱:service@cnnic.cn
投诉与建议:0668-2555555
Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 ICP核准(ICP备案)粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008