PHP图片加水印,然后将加水印的图片上传到七牛云

174 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

今天项目有这么一个需求,简单实现了一下,当然用起来是没有任何问题的,现在把实现代码分享给小伙伴们

 
        $waterImg = './upload/picture/water/**.png';//这个是水印图片,直接放到服务器即可
        $img = './upload/picture/'.$pictureInfo['path'];//原图
        $waterImg = $this->createImgWaterMark($img, $waterImg);
        $imgUrl = 'https://'.$_SERVER['SERVER_NAME'].substr($waterImg,1);
 
 
        // 需要填写你的 Access Key 和 Secret Key,去七牛申请一个账号
        $accessKey = "****************";
        $secretKey = "****************";
        // 读取图片内容
        $imageData = file_get_contents($imgUrl);
        $auth  = new Auth($accessKey, $secretKey);
        // 要上传的空间,根据自己需要在七牛云创建即可
        $bucket = "*****";
        $token = $auth->uploadToken($bucket);
        // 上传到七牛后保存的文件名
        $key = date('YmdHis').mt_rand(0,99999).'.jpg';
        $uploadMgr = new UploadManager();
        $mime  = 'image/jpeg';
        list($rest, $err) = $uploadMgr->put($token, $key, $imageData, null, $mime);
        if($err !== null){
            return  false;
        }else{
            //删除本地图片及数据存储数据
            $this->modelPicture->where(['id'=>$picture_id])->delete();//这行代码需要自己调整,不要照抄
            unlink(substr($waterImg,2));
            return  "http://www.*****.com/".$key;//图片在七牛云存放的地址
        }
    }
     * 图片加水印(适用于png/jpg/gif格式)
     * @param $srcImg 原图片
     * @param $waterImg 水印图片
     * @param $savepath 保存路径
     * @param $savename 保存名字
     * @param $positon 水印位置
     * 1:顶部居左, 2:顶部居右, 3:居中, 4:底部局左, 5:底部居右
     * @param $alpha 透明度 -- 0:完全透明, 100:完全不透明
     *
     * @return 成功 -- 加水印后的新图片地址
     *          失败 -- -1:原文件不存在, -2:水印图片不存在, -3:原文件图像对象建立失败
     *          -4:水印文件图像对象建立失败 -5:加水印后的新图片保存失败
     */
    function createImgWaterMark($srcImg, $waterImg, $savepath=null, $savename=null, $positon=5, $alpha=30)
    {
        $temp = pathinfo($srcImg);
        $name = $temp['basename'];
        $path = $temp['dirname'];
        $exte = $temp['extension'];
        $savename = $savename ? $savename : $name;
        $savepath = $savepath ? $savepath : $path;
        $savefile = $savepath .'/'. $savename;
        $srcinfo = @getimagesize($srcImg);
        if (!$srcinfo) {
            return -1; //原文件不存在
        }
        $waterinfo = @getimagesize($waterImg);
        if (!$waterinfo) {
            return -2; //水印图片不存在
        }
        $srcImgObj = $this->image_create_from_ext($srcImg);
        if (!$srcImgObj) {
            return -3; //原文件图像对象建立失败
        }
        $waterImgObj = $this->image_create_from_ext($waterImg);
        if (!$waterImgObj) {
            return -4; //水印文件图像对象建立失败
        }
        switch ($positon) {
            //1顶部居左
            case 1: $x=$y=0; break;
            //2顶部居右
            case 2: $x = $srcinfo[0]-$waterinfo[0]; $y = 0; break;
            //3居中
            case 3: $x = ($srcinfo[0]-$waterinfo[0])/2; $y = ($srcinfo[1]-$waterinfo[1])/2; break;
            //4底部居左
            case 4: $x = 0; $y = $srcinfo[1]-$waterinfo[1]; break;
            //5底部居右
            case 5: $x = $srcinfo[0]-$waterinfo[0]; $y = $srcinfo[1]-$waterinfo[1]; break;
            default: $x=$y=0;
        }
        imagecopymerge($srcImgObj, $waterImgObj, $x, $y, 0, 0, $waterinfo[0], $waterinfo[1], $alpha);
        switch ($srcinfo[2]) {
            case 1: imagegif($srcImgObj, $savefile); break;
            case 2: imagejpeg($srcImgObj, $savefile); break;
            case 3: imagepng($srcImgObj, $savefile); break;
            default: return -5; //保存失败
        }
        imagedestroy($srcImgObj);
        imagedestroy($waterImgObj);
        return $savefile;
    }
 
 
    function image_create_from_ext($imgfile){
        $info = getimagesize($imgfile);
        $im = null;
        switch ($info[2]) {
            case 1: $im=imagecreatefromgif($imgfile); break;
            case 2: $im=imagecreatefromjpeg($imgfile); break;
            case 3: $im=imagecreatefrompng($imgfile); break;
        }
        return $im;
    }

实现起来是不是很简单,总体来说,我实现的方式是先将图片上传到服务器,进行添加水印,添加完成之后将加水印图片再上传到七牛云,当然最后要把服务器上存储的图片删掉。

短短几百个字,帮您实现两个功能!

希望我的分享能够给小伙伴们带来方便!