PHP实现图片加水印功能

秋天,那永远是蓝湛湛的天空,会突然翻脸而露出险恶的颜色,热带台风夹着密云暴雨,洪水潜流着,复苏的草原又泛起点点苍苍的颜色。然而,台风暴雨一闪而过,强烈的气流依然抖动着耀眼的波光。这时,只有北来的候鸟知道这张温暖的床眠,那飞翔的天鹅、鸿雁和野鸭,就像一片阴深的云朵,使这儿显得更苍郁了。

这里分享下php给图片加水印的几个自定义函数

给图片加水印首先需要开启GD库。

用到的php函数是imagecopymerge() 和 imagecopy()

imagecopymerge函数可以支持两个图像叠加时,设置叠加的透明度

imagecopy函数则不支持叠加透明。

基本概念就啰嗦到这,下边是几个函数的讲解

在图像上打上LOGO水印。

logo透明的png图像,logo.png ,

使用imagecopymerge函数,可以实现打上透明度为30%的水印图标

(可是当我的图片是jpeg,而我的水印图片是png时,水印图片原来透明的背景,变得一片黑灰,背景不透明了,我不知道这个问题是不是只有我自己遇见过)

使用imagecopy函数,可以保留logo本身的透明信息,但无法实现透明度30%的水印叠加

我的解决方式是这样

先用imagecopy()函数生成水印,将水印放到生成的空白图像上

再用imagecopymerge()再将要加水印的图片与其合成一张图片,为其设置透明度

不啰嗦了,直接上函数。

/**
*图片加水印(适用于png/jpg/gif格式)
 * @author camellia
 *@param$srcImg原图片
*@param$waterImg水印图片
*@param$savepath保存路径
*@param$savename保存名字
*@param$positon水印位置
*1:顶部居左,2:顶部居右,3:居中,4:底部局左,5:底部居右
*@param$alpha透明度--0:完全透明,100:完全不透明
*@return成功--加水印后的新图片地址
*失败---1:原文件不存在,-2:水印图片不存在,-3:原文件图像对象建立失败
*-4:水印文件图像对象建立失败-5:加水印后的新图片保存失败
*/
functionimg_water_mark($srcImg,$waterImg,$savepath=null,$savename=null,$positon=5,$alpha=50)
{
$temp=pathinfo($srcImg);
$name=$temp['basename'];
$path=$temp['dirname'];
$exte=$temp['extension'];
$savename=$savename?$savename:$name;
$savepath=$savepath?$savepath:$path;
$savefile=$savepath.'/'.$savename;
$srcinfo=@getimagesize($srcImg);//取得图片信息,是一个数组,第一个值是宽,第二个值是高(因此水印图片的宽高我们是可以限制的)
if(!$srcinfo){
return-1;//原文件不存在
}
$waterinfo=@getimagesize($waterImg);
if(!$waterinfo){
return-2;//水印图片不存在
}
$srcImgObj=image_create_from_ext($srcImg);
if(!$srcImgObj){
return-3;//原文件图像对象建立失败
}
$waterImgObj=image_create_from_ext($waterImg);
if(!$waterImgObj){
return-4;//水印文件图像对象建立失败
}
switch($positon){
//1顶部居左
case1:$x=$y=0;break;
//2顶部居右
case2:$x=$srcinfo[0]-$waterinfo[0];$y=0;break;
//3居中
case3:$x=($srcinfo[0]-$waterinfo[0])/2;$y=($srcinfo[1]-$waterinfo[1])/2;break;
//4底部居左
case4:$x=0;$y=$srcinfo[1]-$waterinfo[1];break;
//5底部居右
case5:$x=$srcinfo[0]-$waterinfo[0];$y=$srcinfo[1]-$waterinfo[1];break;
default:$x=$y=0;
}
imagecopymerge_gc($srcImgObj,$waterImgObj,$x,$y,0,0,$waterinfo[0],$waterinfo[1],$alpha);
//imagecopymerge($srcImgObj,$waterImgObj,$x,$y,0,0,$waterinfo[0],$waterinfo[1],$alpha);
//imagecopy($srcImgObj,$waterImgObj,$x,$y,0,0,$waterinfo[0],$waterinfo[1]);
switch($srcinfo[2]){
case1:imagegif($srcImgObj,$savefile);break;
case2:imagejpeg($srcImgObj,$savefile);break;
case3:imagepng($srcImgObj,$savefile);break;
default:return-5;//保存失败
}
imagedestroy($srcImgObj);
imagedestroy($waterImgObj);
return$savefile;
}

/**
*由文件或URL创建一个新图象
*/
functionimage_create_from_ext($imgfile)
{
$info=getimagesize($imgfile);
$im=null;
switch($info[2]){
case1:$im=imagecreatefromgif($imgfile);break;
case2:$im=imagecreatefromjpeg($imgfile);break;
case3:$im=imagecreatefrompng($imgfile);break;
}
return$im;
}

/**
*将背景透明的陪你过图片与背景不透明的jpg图片合成一张
*并保持png图片背景透明
*/
functionimagecopymerge_gc($dst_im,$src_im,$dst_x,$dst_y,$src_x,$src_y,$src_w,$src_h,$pct){
//透明度
$opacity=$pct;
//获取水印图片宽
$w=imagesx($src_im);
//获取水印图片高
$h=imagesy($src_im);
//函数用于创建一幅空白图像
$cut=imagecreatetruecolor($src_w,$src_h);
//拷贝图像的一部分
imagecopy($cut,$dst_im,0,0,$dst_x,$dst_y,$src_w,$src_h);
//计算透明度
//$opacity=100-$opacity;
//生成水印,将水印放到生成的空白图像上
imagecopy($cut,$src_im,0,0,$src_x,$src_y,$src_w,$src_h);
//再将要加水印的图片与其合成一张图片,为其设置透明度
imagecopymerge($dst_im,$cut,$dst_x,$dst_y,$src_x,$src_y,$src_w,$src_h,$opacity);
}
/**
*============================我是分隔符==============================
*/

注:调用方法

img_water_mark(‘要加水印图片' , ‘水印图片' , ‘保存路径');

其他参数函数的备注里边有介绍。对应其位置就好

但是,这个也是有问题的,测试的时候,发现,当水印图片是png文件,被加水印的图片也是png图片时,就会出现水印图片原来透明的背景,变得一片黑灰,背景不透明了。

这个问题,暂时还没有想到解决的办法,使用的时候,注意一下这个问题。

请注意:水印功能需要用到GD库,请检查下php是否开启了GD库扩展。

到此这篇关于PHP实现图片加水印功能的文章就介绍到这了,更多相关PHP图片加水印内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

您可能有感兴趣的文章
PHP性能优化案例分享

PHP实现短信验证码的发送次数限制

PHP中的异常处理机制深入讲解

PHP常见七种算法合集代码实例

PHP微信扫描二维码关注公众号后自动登录第三方网站