早睡早起,方能养生!
Sleep early rise early, square can preserve one's health!

PHP给图片加水印 , 合并二维码 , 最新三合一 imagick

super
2021-09-25 16:47
views 99

今天发现有人把我文章发到了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 条讨论
top