PHP给图片加水印 , 合并二维码 , 最新三合一 imagick
super
2021-09-25 16:47
3309
今天发现有人把我文章发到了csdn上 , 是一篇特意注明了禁止转载的… 还是直链的我站内的图片 , 被偷了好多流量 , 以前也没给图片加水印 , 好气哦_(:з」∠)_
寻思还是把水印加上吧 ! 结合以前的方式 , 今天又研究了一下用imagick加水印 , 效果如下
1 )
if (!function_exists('imgMerge')) {
/**
* 图片合并
* @author super
* @link https://rongsp.com/article/190.html
* @date 2021/09/25
* @param string $file_name 图片路径 /public/test.jpg
* @param string $watermark 水印路径 /public/watermark.png
* @return string
**/
function imgMerge($file_name, $watermark)
{
if (!file_exists('.' . $file_name) || !file_exists('.' . $watermark)) {
return $file_name;
}
// 分析原图
$original_analysis = getimagesize('.' . $file_name);
// 分析水印图片
$watermark_analysis = getimagesize('.' . $watermark);
$bgImg = imagecreatefromstring(file_get_contents('.' . $file_name));
$wmImg = imagecreatefromstring(file_get_contents('.' . $watermark));
$x = $original_analysis[0] - $watermark_analysis[0];
$y = $original_analysis[1] - $watermark_analysis[1];
// 方式1: 复制水印到真彩画布中(重新取样-获取透明图片)
imagecopyresampled($bgImg, $wmImg, $x, $y, 0, 0, $watermark_analysis[0], $watermark_analysis[1], $watermark_analysis[0], $watermark_analysis[1]);
// 方式2: 与水印合并 (不推荐理由: 若你的水印是透明的, 此方式合并会使水印的底色变为白色)
// imagecopymerge($bgImg, $wmImg, $x, $y, 0, 0, imagesx($wmImg), imagesy($wmImg), 100);
// 输出合成图片
switch ($original_analysis[2]) {
case 1:
imagegif($bgImg, '.' . $file_name);
break;
case 2:
imagejpeg($bgImg, '.' . $file_name);
break;
case 3:
imagepng($bgImg, '.' . $file_name);
break;
default:
exit("不支持的水印图片文件类型");
}
imagedestroy($bgImg);
return $file_name;
}
}
2 )
使用 imagick
use Imagick;
if (!function_exists('imagickMerge')) {
/**
* 图片合并
* @author super
* @link https://rongsp.com/article/190.html
* @date 2021/09/25
* @param string $file_name 图片路径 /public/test.jpg
* @param string $watermark 水印路径 /public/watermark.png
* @return string
**/
function imagickMerge($file_name, $watermark)
{
if (!file_exists('.' . $file_name) || !file_exists('.' . $watermark)) {
return $file_name;
}
// 分析原图
$original_analysis = getimagesize('.' . $file_name);
$mime = $original_analysis['mime'];
$suffix = explode('/', $mime);
// 分析水印图片
$watermark_analysis = getimagesize('.' . $watermark);
// 创建背景画布
$canvas = new Imagick();
$canvas->newimage($original_analysis[0], $original_analysis[1], 'white');
$canvas->setImageFormat($suffix[1]);
// 读取主图
$pic = new Imagick();
$pic->readImage('.' . $file_name);
$pic->scaleimage($original_analysis[0], $original_analysis[1], TRUE);
// 读取水印
$watermarkObj = new Imagick();
$watermarkObj->readImage('.' . $watermark);
$watermarkObj->scaleimage($watermark_analysis[0], $watermark_analysis[1], TRUE);
// 将主图和水印合并到背景画布
$x = $original_analysis[0] - $watermark_analysis[0];
$y = $original_analysis[1] - $watermark_analysis[1];
$canvas->compositeImage($pic, Imagick::COMPOSITE_OVER, 0, 0);
$canvas->compositeImage($watermarkObj, Imagick::COMPOSITE_OVER, $x, $y);
// 保存图片到另一目录
$result = $canvas->writeimage('.' . $file_name);
/*if ($result === true) {
可加判断 == true 为合并成功
}*/
return $file_name;
}
}
若安装imagick后 , 仍提示: Class 'app\admin\controller\Imagick' not found
0 条讨论