图片添加水印

技术分享 · mrgao · 于 2年前 发布 · 1021 次阅读

因为我这边需要图片加水印 但是我搜索了一下 发现是什么七牛的api 我想这些api可能需要钱的吧 然后就直接在图片上传里面直接写死了一个加水印图片的代码 然后呢 分享出来一下

	if ($isMoved) {
        $imgUrl = $this->getUrlByRelativePath($imgSavedRelativePath);
        $imgPath = $this->getDirByRelativePath($imgSavedRelativePath);
        $bg = imagecreatefrompng('水印图片位置');
		//判断图片后坠因为下面图片处理用到的方法不一样
        if ($imgType=="image/jpeg"){
		//用于从文件或 URL 载入一幅图像,成功返回图像资源
            $image = imagecreatefromjpeg($imgPath);
			//获取图片的宽
            $w=imagesx($image);
			//获取图片的高
            $h=imagesy($image);
            //取两个值之间最小的值防止水印超出 有其他办法处理 但是这个最简单
            $min= $w>$h?$h:$w;
            //水印是图片高宽最小的三分之一 防止水印跟图片之间差距过大
            $width=intval($min/3);
            //创建新水印的底图
            $dst_im = imagecreatetruecolor($width, $width);
            //创建颜色透明
            $alpha = imagecolorallocatealpha($dst_im, 255, 255, 255, 127);
            //水印根据取的值进行缩放
            imagecopyresized($dst_im, $bg, 0, 0, 0, 0, $width, $width, imagesx($bg), imagesy($bg));
            //缩放结果进行颜色设置 $alpha是把图片设置成透明图片
            imagefill($dst_im, 0, 0, $alpha);
            //水印贴到图片上
            imagecopy($image, $dst_im, 1, 1, 0, 0, $width, $width);
            //图片保存
            imagejpeg($image,$this->getCurrentBaseImgDir().$imgSavedRelativePath);
        }elseif ($imgType=="image/png"){
            $image = imagecreatefrompng($imgPath);
            $w=imagesx($image);
            $h=imagesy($image);
            //取最小
            $min= $w>$h?$h:$w;
            //水印是图片高宽最小的三分之一
            $width=intval($min/3);
            //创建新水印的底图
            $dst_im = imagecreatetruecolor($width, $width);
            //创建颜色透明
            $alpha = imagecolorallocatealpha($dst_im, 255, 255, 255, 127);
            //水印根据取的值进行缩放
            imagecopyresized($dst_im, $bg, 0, 0, 0, 0, $width, $width, imagesx($bg), imagesy($bg));
            //缩放结果进行颜色设置
            imagefill($dst_im, 0, 0, $alpha);
            //水印贴到图片上
            imagecopy($image, $dst_im, 1, 1, 0, 0, $width, $width);
            //图片保存
            imagepng($image,$this->getCurrentBaseImgDir().$imgSavedRelativePath);
        }elseif ($imgType=="image/gif"){
            $w=imagesx($image);
            $h=imagesy($image);
            //取最小
            $min= $w>$h?$h:$w;
            //水印是图片高宽最小的三分之一
            $width=intval($min/3);
            //创建新水印的底图
            $dst_im = imagecreatetruecolor($width, $width);
            //创建颜色透明
            $alpha = imagecolorallocatealpha($dst_im, 255, 255, 255, 127);
            //水印根据取的值进行缩放
            imagecopyresized($dst_im, $bg, 0, 0, 0, 0, $width, $width, imagesx($bg), imagesy($bg));
            //缩放结果进行颜色设置
            imagefill($dst_im, 0, 0, $alpha);
            //水印贴到图片上
            imagecopy($image, $dst_im, 1, 1, 0, 0, $width, $width);
            //图片保存
            imagegif($image,$this->getCurrentBaseImgDir().$imgSavedRelativePath);
        }
        //销毁图像资源
        imagedestroy($image);
        imagedestroy($dst_im);
        imagedestroy($bg);
        return [$imgSavedRelativePath, $imgUrl, $imgPath];
    } else {
        return false;
    }
	这个代码在vendor/fancyecommerce/fecshop/services/Image.php的saveUploadImg方法里面  如果有人使用发现有bug请留言  我看见了好改一下我自己的代码  
	
	整体思路就是imagecopy这个函数  这个函数是把两张图片贴成一张  大部分都是在处理水印图片 开始是等fecmall上传图片的代码完全跑完  然后根据结果的图片路径来处理图片  首先因为我水印图片是固定的  上传图片的不是固定的  所以我要获取上传图片的高宽来重新生成一张水印图片  生成的新水印图片的宽高取上传图片宽高最小值的三分之一  然后通过imagecopyresized这个PHP函数来缩放  缩放完成的图片是黑底的  我们需要重新设置成透明的  设置完成了 通过imagecopy这个函数把上传图片跟新生成的水印图片进行合并  然后保存到上传图片的路径下面去  这个图片会直接覆盖掉上传图片  新的图片介绍带水印的上传图片
共收到 1 条回复
Fecmall#12年前 0 个赞

多谢你的分享

但是,我好像看不懂,请写明详细逻辑,简单明了的写清楚

添加回复 (需要登录)
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册
Your Site Analytics