前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【黄啊码】一次性讲清楚thinkphp给图片添加水印

【黄啊码】一次性讲清楚thinkphp给图片添加水印

作者头像
黄啊码
发布2023-12-18 11:21:54
1960
发布2023-12-18 11:21:54
举报

大家好,我是黄啊码,今天给大家讲讲在tp中如何给图片添加水印。

在这之前,我自己尝试了一把,直接在图片上添加文字,但事与愿违,总是会出现乱码,无论怎么设置都不行,除非设置字体,但字体最怕版权问题或者出现不兼容情况,所以我比较粗暴,直接在图片上添加图片水印。

废话不多说,直接上代码

代码语言:javascript
复制
/**
     * @param $sourcePath
     * @param $logoPath
     * @param $savePath
     * 给图片加水印
     */
    function addImageWater($sourcePath,$logoPath,$savePath){

        $img_info =  getimagesize($sourcePath);

        $im = null;
        
        if($img_info[2]==3){
            $im = imagecreatefrompng($sourcePath);
        }else{
            $im = imagecreatefromjpeg($sourcePath);
        }
        $watermark = imagecreatefrompng($logoPath);
        //获取图、水印 宽高类型
        list($bgWidth, $bgHight, $bgType) = getimagesize($sourcePath);
        list($logoWidth, $logoHight, $logoType) = getimagesize($logoPath);
        //定义平铺数据
        $x_length = $bgWidth-10; //x轴总长度
        $y_length = $bgHight-10; //y轴总长度
        //创建透明画布
        $opacity=0;
        $w = imagesx($watermark);
        $h = imagesy($watermark);
        $cut = imagecreatetruecolor($w,$h);
        $background_color = imagecolortransparent($cut,  0);
        
        imagefill($cut, 0, 0,$background_color);
        //整合水印
        imagecopy($cut, $watermark, 0, 0, 0, 0, $w, $h);
        //循环平铺水印
        for ($x = 0; $x < $x_length; $x++)
        {
            for ($y = 0; $y < $y_length; $y++) {
                imagecopymerge($im, $cut, $x, $y, 0, 0, $logoWidth, $logoHight, 20);
                $y += $logoHight+120;
            }
            $x += $logoWidth+140;
        }

        if($img_info[2]==3){
            imagepng($im,$savePath);
        }else{
            imagejpeg($im,$savePath);
        }
    }

由于我使用的是面向过程的方式写的,所以看上去有点啰嗦。

getimagesize这个函数大家都知道,是用来获取图片信息的,分别获取图片的宽高和后缀,我们这里需要的是获取图片的后缀,方便后边函数的调用。

用imagecreatefrompng或imagecreatefromjpeg创建对应的画布,顺便把水印图片的画布也带上

然后开始创建透明画布,如果你创建的不是透明画布,就不要用

imagecolortransparent(GdImage image, ?int color = null)  不然无法指定颜色

而应该用

imagecolorallocate(GdImage image, int red, int green, int blue)

上边的color是指画布的透明度,0表示完全透明,在这里我加的是透明图片的水印,所以肯定是指定透明的啦。

接下来就是用imageCopy将水印和画布整合起来。

到这里,其实直接用imagecopymerge结合imagepng或imagejpeg图片水印就基本加上去了。

可是我们需要将水印铺满整张图片,单纯一个那不得调用很多次函数?

确实如此,所以我们需要用循环,并获取原图宽高,然后将画布完全铺满整张图片

y += logoHight+120; x += logoWidth+140;

这里的参数可以自己修改,黄啊码是为了将水印分布得平衡一点,不然一个个紧挨着很密集。

看案例演示前后对比:

好了,今天的分享就到这里,有问题的留个言,别忘了一键三连,下次我们还会再见!

我是黄啊码,码字的码,退。。。退。。。退。。。朝!

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2023-07-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档