共计 2286 个字符,预计需要花费 6 分钟才能阅读完成。
/*
* 制作图片水印
* @param string $old_img 原图地址
* @param string $water 水印图地址
* @param int $offset_x 水平偏移量
* @param int $offset_y 垂直偏移量
* @return string 新图片地址
* @author zhao <2019-11-4>
*/
private function makeImgWater($ori_img, $water_img, $offset_x, $offset_y)
{$original = getimagesize($ori_img); // 得到图片的信息数组
$watermark = getimagesize($water_img);
//$original[2] 是图片类型,其中 1 表示 gif、2 表示 jpg、3 表示 png
$s_original = $this->imgCreateFrom($ori_img, $original[2]);// 把两个图片写入画布
$s_watermark = $this->imgCreateFrom($water_img, $watermark[2]);
//dst_im 目标图像链接资源。src_img 源图像链接资源。dst_x 目标点的 x 坐标。dst_y 终点的 y 坐标。src_x 源点的 x 坐标。src_y
// 源点的 y 坐标。src_w 源宽度。src_h 源高度。// 打图片水印, 将图片绘制到画布上 0,0 即从坐标 0,0 开始取
imagecopy($s_original, $s_watermark, $offset_x, $offset_y, 0, 0, $watermark[0], $watermark[1]);
$up_path = ROOT_PATH . 'public/uploads/file/' . date("Y-m-d");
if (!is_dir($up_path)) {mkdir($up_path);
}
$img_name = time() . '.jpg'; // 图片名, 防止和文字水印图片冲突
ob_clean();// 清除缓存
$new_img = $up_path . '/' . $img_name;// 图片名
$loop = imagejpeg($s_original, $new_img);// 生成新的图片 (jpg 格式),如果用 imagepng 可以生成 png 格式
if($loop){
// 上传到服务器, 返回新图片地址
return $new_img;
}
}
/**
* 制作文字水印
* @param string $ori_img 原图地址
* @param string $water_text [< 水印文字 >]
* @param int $font_size [< 字号 >]
* @param int $pos_x [< 水平偏移量 >]
* @param int $pos_y [< 垂直偏移量 >]
* @param int $tilt [< 文字的倾斜度, 默认为 0 >]
* @return string 新图片地址
* @author zhao <[<2019-10-5>]>
*/
private function makeTextWater($ori_img, $water_text, $font_size, $pos_x, $pos_y, $tilt=0)
{$original = getimagesize($ori_img); // 得到原图片的信息数组
//$original[2] 是图片类型,其中 1 表示 gif、2 表示 jpg、3 表示 png
$s_original = $this->imgCreateFrom($ori_img, $original[2]);// 把图片写入画布
// 文字水印部分
$color = imagecolorallocate($s_original,0,0,0);// 为一幅图像分配颜色 0,0,0 默认黑色
// 打文字水印
imagettftext($s_original, $font_size, $tilt, $pos_x, $pos_y, $color, ROOT_PATH .'public/static/assets/fonts/MSYH.TTC', $water_text);
$up_path = ROOT_PATH . 'public/uploads/file/' . date("Y-m-d");
if (!is_dir($up_path)) {mkdir($up_path);
}
$img_name = time() . '.jpg';
ob_clean();// 清除缓存
$new_img = $up_path . '/' . $img_name;// 图片名
$loop = imagejpeg($s_original, $new_img);// 生成新的图片 (png 格式)
if($loop){
// 返回图片地址
return $new_img;
}
}
/**
* 根据文件类型 创建一个新画布
*/
private function imgCreateFrom($img_src, $val){switch($val){case 1 : $img = imagecreatefromgif($img_src);
break;
case 2 : $img = imagecreatefromjpeg($img_src);
break;
case 3 : $img = imagecreatefrompng($img_src);
break;
}
return $img;
}
用 PHP 实现图片水印很简单, 毕竟都有封装好的系统函数可以直接调用. 且可以多次调用, 来实现图片加多个水印的效果, 比如在一个 foreach 循环里调用多次文字水印方法, 每次传不同的坐标和文字, 把生成的图片地址返回再作为下一次调用的原图地址. 即可在一张图片的不同位置添加水印. 图片水印也同理.
正文完