我们有时需要对推片打上水印,防止别人盗用,thinkphp 自己的水印功能只能选择位置添加水印,但是有时候图片某些位置比较干净(空白部分),很容易处理掉,这样就无法起到防止盗用图片的效果。
这篇教程分享一下使用ThinkPHP5 实现图片水印平铺的效果。
关键代码操作
1、打开第三方类库文件:vendor\topthink\think-image\src\Image.php
2、把下面代码复制到上方地址的图片处理类库中(即增加一个图片处理方法)/**
*添加图片水印平铺
*
*@paramstring$source水印图片路径
*@paramint$alpha透明度
*@return$this
*/
publicfunctiontilewater($source,$alpha=100)
{
if(!is_file($source)){
thrownewImageException('水印图像不存在');
}
//获取水印图像信息
$info=getimagesize($source);
if(false===$info||(IMAGETYPE_GIF===$info[2]&&empty($info['bits']))){
thrownewImageException('非法水印文件');
}
//创建水印图像资源
$fun='imagecreatefrom'.image_type_to_extension($info[2],false);
$water=$fun($source);
//设定水印图像的混色模式
imagealphablending($water,true);
do{
//添加水印
$src=imagecreatetruecolor($info[0],$info[1]);
//调整默认颜色
$color=imagecolorallocate($src,255,255,255);
imagefill($src,0,0,$color);
//循环平铺水印
for($x=0;$xinfo['width']-10;$x){
for($y=0;$yinfo['height']-10;$y){
imagecopy($src,$this->im,0,0,$x,$y,$info[0],$info[1]);
imagecopy($src,$water,0,0,0,0,$info[0],$info[1]);
imagecopymerge($this->im,$src,$x,$y,0,0,$info[0],$info[1],$alpha);
$y+=$info[1];
}
$x+=$info[0];
}
//销毁临时图片资源
imagedestroy($src);
}while(!empty($this->gif)&&$this->gifNext());
//销毁水印资源
imagedestroy($water);
return$this;
}
使用方法:
注意:仅供参考,你可以改造到你的项目的上传图片部分!usethink\Image;
class....
publicfunctiontest(){
$image=Image::open('bg.jpg');
//给原图设置水印图片(colleced.png)并保存water_image.png(可以带路径)
$image->tilewater('colleced.png',100)->save('water_image.png');
echo"";
}
效果如下: