因为我这边需要图片加水印 但是我搜索了一下 发现是什么七牛的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这个函数把上传图片跟新生成的水印图片进行合并 然后保存到上传图片的路径下面去 这个图片会直接覆盖掉上传图片 新的图片介绍带水印的上传图片