大家好,我是黄啊码,今天给大家讲讲在tp中如何给图片添加水印。
在这之前,我自己尝试了一把,直接在图片上添加文字,但事与愿违,总是会出现乱码,无论怎么设置都不行,除非设置字体,但字体最怕版权问题或者出现不兼容情况,所以我比较粗暴,直接在图片上添加图片水印。
废话不多说,直接上代码
/**
* @param $sourcePath
* @param $logoPath
* @param $savePath
* 给图片加水印
*/
function addImageWater($sourcePath,$logoPath,$savePath){
$img_info = getimagesize($sourcePath);
$im = null;
if($img_info[2]==3){
$im = imagecreatefrompng($sourcePath);
}else{
$im = imagecreatefromjpeg($sourcePath);
}
$watermark = imagecreatefrompng($logoPath);
//获取图、水印 宽高类型
list($bgWidth, $bgHight, $bgType) = getimagesize($sourcePath);
list($logoWidth, $logoHight, $logoType) = getimagesize($logoPath);
//定义平铺数据
$x_length = $bgWidth-10; //x轴总长度
$y_length = $bgHight-10; //y轴总长度
//创建透明画布
$opacity=0;
$w = imagesx($watermark);
$h = imagesy($watermark);
$cut = imagecreatetruecolor($w,$h);
$background_color = imagecolortransparent($cut, 0);
imagefill($cut, 0, 0,$background_color);
//整合水印
imagecopy($cut, $watermark, 0, 0, 0, 0, $w, $h);
//循环平铺水印
for ($x = 0; $x < $x_length; $x++)
{
for ($y = 0; $y < $y_length; $y++) {
imagecopymerge($im, $cut, $x, $y, 0, 0, $logoWidth, $logoHight, 20);
$y += $logoHight+120;
}
$x += $logoWidth+140;
}
if($img_info[2]==3){
imagepng($im,$savePath);
}else{
imagejpeg($im,$savePath);
}
}
由于我使用的是面向过程的方式写的,所以看上去有点啰嗦。
getimagesize这个函数大家都知道,是用来获取图片信息的,分别获取图片的宽高和后缀,我们这里需要的是获取图片的后缀,方便后边函数的调用。
用imagecreatefrompng或imagecreatefromjpeg创建对应的画布,顺便把水印图片的画布也带上
然后开始创建透明画布,如果你创建的不是透明画布,就不要用
imagecolortransparent(GdImage image, ?int color = null) 不然无法指定颜色
而应该用
imagecolorallocate(GdImage image, int red, int green, int blue)
上边的color是指画布的透明度,0表示完全透明,在这里我加的是透明图片的水印,所以肯定是指定透明的啦。
接下来就是用imageCopy将水印和画布整合起来。
到这里,其实直接用imagecopymerge结合imagepng或imagejpeg图片水印就基本加上去了。
可是我们需要将水印铺满整张图片,单纯一个那不得调用很多次函数?
确实如此,所以我们需要用循环,并获取原图宽高,然后将画布完全铺满整张图片
y += logoHight+120; x += logoWidth+140;
这里的参数可以自己修改,黄啊码是为了将水印分布得平衡一点,不然一个个紧挨着很密集。
看案例演示前后对比:
好了,今天的分享就到这里,有问题的留个言,别忘了一键三连,下次我们还会再见!
我是黄啊码,码字的码,退。。。退。。。退。。。朝!