乐趣区

php生成文字水印和图片水印

/*  
 * 制作图片水印
 * @param  string $old_img 原图地址
 * @param string $water 水印图地址
 * @param int $offset_x 水平偏移量
 * @param int $offset_y 垂直偏移量
 * @return string 新图片地址
 * @author zhao <2019-11-4>
 */
private function makeImgWater($ori_img, $water_img, $offset_x, $offset_y)
{$original = getimagesize($ori_img); // 得到图片的信息数组
    $watermark = getimagesize($water_img);
    
    //$original[2] 是图片类型,其中 1 表示 gif、2 表示 jpg、3 表示 png 
    $s_original = $this->imgCreateFrom($ori_img, $original[2]);// 把两个图片写入画布
    $s_watermark = $this->imgCreateFrom($water_img, $watermark[2]);
    
    //dst_im 目标图像链接资源。src_img 源图像链接资源。dst_x 目标点的 x 坐标。dst_y 终点的 y 坐标。src_x 源点的 x 坐标。src_y
     // 源点的 y 坐标。src_w 源宽度。src_h 源高度。// 打图片水印, 将图片绘制到画布上 0,0 即从坐标 0,0 开始取
    imagecopy($s_original, $s_watermark, $offset_x, $offset_y, 0, 0, $watermark[0], $watermark[1]);
    $up_path = ROOT_PATH . 'public/uploads/file/' . date("Y-m-d");
    if (!is_dir($up_path)) {mkdir($up_path);
    }
    $img_name = time() . '.jpg'; // 图片名, 防止和文字水印图片冲突
    ob_clean();// 清除缓存
    $new_img = $up_path . '/' . $img_name;// 图片名
    $loop = imagejpeg($s_original, $new_img);// 生成新的图片 (jpg 格式),如果用 imagepng 可以生成 png 格式
    if($loop){
        // 上传到服务器, 返回新图片地址
        return $new_img;
        
    }

}


/**
 * 制作文字水印
 * @param string $ori_img 原图地址
 * @param string $water_text [< 水印文字 >]
 * @param int $font_size [< 字号 >] 
 * @param int $pos_x [< 水平偏移量 >]
 * @param int $pos_y [< 垂直偏移量 >]
 * @param int $tilt [< 文字的倾斜度, 默认为 0 >]
 * @return string 新图片地址
 * @author zhao <[<2019-10-5>]>
 */
private function makeTextWater($ori_img, $water_text, $font_size, $pos_x, $pos_y, $tilt=0)
{$original = getimagesize($ori_img); // 得到原图片的信息数组
      //$original[2] 是图片类型,其中 1 表示 gif、2 表示 jpg、3 表示 png 
    $s_original = $this->imgCreateFrom($ori_img, $original[2]);// 把图片写入画布
    // 文字水印部分
    $color = imagecolorallocate($s_original,0,0,0);// 为一幅图像分配颜色 0,0,0 默认黑色

    // 打文字水印
    imagettftext($s_original, $font_size, $tilt, $pos_x, $pos_y, $color,  ROOT_PATH .'public/static/assets/fonts/MSYH.TTC', $water_text);
    $up_path = ROOT_PATH . 'public/uploads/file/' . date("Y-m-d");
    if (!is_dir($up_path)) {mkdir($up_path);
    }
    $img_name = time() . '.jpg';
    ob_clean();// 清除缓存
    $new_img = $up_path . '/' . $img_name;// 图片名
    $loop = imagejpeg($s_original, $new_img);// 生成新的图片 (png 格式)

    if($loop){
        // 返回图片地址
        return $new_img;
    }

}


/**
 * 根据文件类型 创建一个新画布
 */
private function imgCreateFrom($img_src, $val){switch($val){case 1 : $img = imagecreatefromgif($img_src);
            break;
        case 2 : $img = imagecreatefromjpeg($img_src);
            break;
        case 3 : $img = imagecreatefrompng($img_src);
            break;
    }
    return $img;

}

用 PHP 实现图片水印很简单, 毕竟都有封装好的系统函数可以直接调用. 且可以多次调用, 来实现图片加多个水印的效果, 比如在一个 foreach 循环里调用多次文字水印方法, 每次传不同的坐标和文字, 把生成的图片地址返回再作为下一次调用的原图地址. 即可在一张图片的不同位置添加水印. 图片水印也同理.
退出移动版