tp5生成缩略图及添加水印详解

在北京网建设中,有很多客户提出了要为上传的图片添加水印功能,于是我们使用了tp5提供的image扩展类来实现此功能。

核心代码:

//异步上传缩略图
     public function upimg(){
         $file = request()->file('img');
         $info = $file->move(ROOT_PATH . 'public/static/index/uploads/img');
         if($info){
             $imgSrc=INDEXIMG.$info->getSaveName();
             $image = \think\Image::open($imgSrc);
             $water=INDEXIMG.'water.png';//水印图片
             $image->thumb(800, 800,1)->water($water,1,50)->save($imgSrc);//生成缩略图、删除原图以及添加水印
             // 成功上传后 获取上传信息
             echo $info->getSaveName();
         }else{
             // 上传失败获取错误信息
             echo $file->getError();
         }
     }

但是这个方法,只能添加水印图片或者添加一行水印文字,那么实际开发中涉及到推广,则需要调用多行的文本显示,那该怎么办呢?

改动并不大,修改text()方法来实现。

$text = explode('|', $text); //把字符串文字转为数组,没有分隔符的文字可以通过函数按照制定长度来分割
         $maxtext = 0;
         foreach ($text as $val) {
             $maxtext = strlen($val) > strlen($maxtext) ? $val : $maxtext;
         }
         if (!is_file($font)) {
             $this->error='not_exist_font';
             $this->error['not_exist_font']=":{$font}";
         }
         //获取文字信息
         $info = imagettfbbox($size, $angle, $font, $maxtext);
         $textHeight = $info[1] - $info[7];
         $lineHeight = $textHeight + 3;

然后底部写入文字代码,加一个循环即可

 $val) {
    imagettftext($this->im, $size, $angle, $x + $ox, $y + $oy + $key * $lineHeight, $col, $font, $val);
}

通过这样处理,我们把传入的字符串转为数组后,循环添加文字水印时,只是增加$lineHeight高度而已。

就这样实现了多行文本水印。

希望对大家的开发有所帮助。

2017-12-04

0 个评论