网站首页 文章专栏 将一张图片水印到另一张图片

将一张图片水印到另一张图片

编辑时间:2020-06-18 16:41:35 作者:苹果 浏览量:5776


    前言:将一张图片水印到另一张图片上面,最常用的方法是将水印图进行透明处理,然后覆盖到原图,并定位到相应位置


利用composer组件  intervention/image 能很轻易的实现(laravle中已经集成) 官网 http://image.intervention.io/use/basics


    composer require intervention/image

    use Intervention\Image\ImageManagerStatic as Image;
    $image = '原图地址';
    $water_image = '水印图地址';
    $water_image = Image::make($water_image)->opacity(50)->widen(200);//水印图片转成透明度50,宽200
    $new_image = '生成的新的图片地址';
    $img = Image::make($image);
    $img->insert($water_image, 'bottom-right', 100, 1100);//从右下方开始定位
    $img->save($new_image);

上面这个组件确实功能很强大,能把图片的各种操作极大的简化,但是经使用发现,当对图片设置透明度的时候,经常把服务器CPU跑满,本来一秒不到的时间,就因为一个透明属性愣是多运行了5秒以上,感觉这是它的一个bug,期待该组件后面可以优化。


为了能快速的试下图片水印功能,回归到PHP源生,用PHP内置的GD库自行组装处理  官网 https://www.php.net/manual/zh/book.image.php

    /**    
     * @param $imgSrc //待处理原图地址
     * @param $water_image //水印图地址
     * @param $watermark_file //生成的新的图片地址
     * @author: hbh
     * @Time: 2020/6/18   16:41
     */
    public static function warterImage($imgSrc, $water_image, $watermark_file)
    {
    
        $srcInfo = @getimagesize($imgSrc);
        $srcImg_w = $srcInfo[0];
        $srcImg_h = $srcInfo[1];
    
        switch ($srcInfo[2]) {
            case 1:
                $srcim = imagecreatefromgif($imgSrc);
                break;
            case 2:
                $srcim = imagecreatefromjpeg($imgSrc);
                break;
            case 3:
                $srcim = imagecreatefrompng($imgSrc);
                break;
            default:
                die("不支持的图片文件类型");
                exit;
        }
    
        /*合成水印路径为空就覆盖原图*/
        if (empty($watermark_file)) {
            $watermark_file = $imgSrc;
        }
    
    
        if (!file_exists($water_image) || empty($water_image)) {
            return;
        }
    
        $water_imageInfo = @getimagesize($water_image);
        $water_image_w = $water_imageInfo[0];
        $water_image_h = $water_imageInfo[1];
    
        if ($srcImg_w < $water_image_w || $srcImg_h < $water_image_h) {
            return;
        }
    
        switch ($water_imageInfo[2]) {
            case 1:
                $markim = imagecreatefromgif($water_image);
                break;
            case 2:
                $markim = imagecreatefromjpeg($water_image);
                break;
            case 3:
                $markim = imagecreatefrompng($water_image);
                break;
            default:
                die("不支持的水印图片文件类型");
                exit;
        }
    
        $logow = $water_image_w;
        $logoh = $water_image_h;
    
        //定位到中间位置
        $x = ($srcImg_w - $logow) / 2;
        $y = ($srcImg_h - $logoh) / 2;
    
        $dst_img = @imagecreatetruecolor($srcImg_w, $srcImg_h);
        //imagecopymerge PHP 内置图像方法 详见 https://www.php.net/manual/zh/function.imagecopymerge.php
        imagecopymerge($dst_img, $srcim, 0, 0, 0, 0, $srcImg_w, $srcImg_h, 100);
    
        imagecopymerge($dst_img, $markim, $x, $y, 0, 0, $logow, $logoh, 50);
        imagedestroy($markim);
    
    
        switch ($srcInfo[2]) {
            case 1:
                imagegif($dst_img, $watermark_file);
                break;
            case 2:
                imagejpeg($dst_img, $watermark_file);
                break;
            case 3:
                imagepng($dst_img, $watermark_file);
                break;
            default:
                die("不支持的水印图片文件类型");
                exit;
        }
    
        imagedestroy($dst_img);
        imagedestroy($srcim);
    }



    出自:何冰华个人网站

    地址:https://www.hebinghua.com/

    转载请注明出处


来说两句吧
最新评论