PHP图片批量添加水印

  • Jesse
  • 2016-08-08 19:57:00
  • 2970
最近在做根据用户信息动态生成证书,遇到了很多问题,不过也都一一解决了。So,记录下来 主要有:不能正确读取图片信息,汉字水印字体,图片下载、打印,FTP上传等问题

该方法可以同时添加多个文字水印和图片水印。

主要原理是:用户上传头像,提交信息,从后台拿到模板图片地址,在根据模板要填的空计算好坐标,写到对应的位置,然后保存到本地临时目录,再上传至FTP或者七牛云等图床。

/**
 * 图片添加水印(包括文字水印和图片水印)
 * @param  string $img             来源图片
 * @param  string $filename        文件名
 * @param  array  $waterWordConfig 文字水印配置
 * @param  array  $waterImgConfig  图片水印配置
 * @return string                  临时存放图片地址
 *
 * $waterconfig = array(
 *      '0' => array(
 *              'text'  => '张三丰',   //水印文字
 *              'x'     =>  '90',       //水印坐标
 *              'y'     =>  '295',
 *              'size'  =>  '22',       //水印文字大小
 *              'rgb'   =>  array('46','46','46','-1'), //水印文字颜色
 *              'angle' => 0,   //水印文字颜色旋转角度
 *              'fontfile'  =>  "./SIMKAI.TTF"  //水印文字字体
 *          )
 *      )
 *
 * $imgconfig = array(
 *      '0' => array(
 *              'src_img'   => './img/userhead.jpg',    //水印图片路径
 *              'dst_x'     =>  '775',  //目标图像开始 x 坐标,x,y同为 0 则从左上角开始
 *              'dst_y'     =>  '75',
 *              'src_x'     =>  '0',    //拷贝图像开始 x 坐标
 *              'src_y'     =>  '0',
 *              'pct'       =>  '100'   //图像合并程度,取值 0-100 ,当 pct=0 时,实际上什么也没做,反之完全合并。
 *          )
 *  );
 */
function imgFontWater($img,$filename,$waterWordConfig,$waterImgConfig=array()){
    if (!$img) {
        return false;
    }
    //获取图片信息 
    $info = getimagesize($img);
    //获取图片扩展名 
    $type = image_type_to_extension($info[2],false); 
    //动态的把图片导入内存中 
    $image = imagecreatefromstring(file_get_contents($img));
    if ($waterWordConfig) {
        foreach ($waterWordConfig as $config) {
            //指定字体颜色
            $color = imagecolorallocate($image,$config['rgb'][0],$config['rgb'][1],$config['rgb'][2]);
            //给图片添加文字
            imagefttext($image, $config['size'], $config['angle'], $config['x'], $config['y'], $color, $config['fontfile'], $config['text']);
        }
    }

    $src_img_arr = array();
    if ($waterImgConfig) {
        foreach ($waterImgConfig as $imgconfig) {
            $src_img_arr[] = $src_img = imagecreatefromstring(file_get_contents($imgconfig['src_img']));
            list($src_w, $src_h) = getimagesize($imgconfig['src_img']);
            imagecopymerge($image, $src_img, $imgconfig['dst_x'], $imgconfig['dst_y'], $imgconfig['src_x'], $imgconfig['src_y'], $src_w, $src_h, $imgconfig['pct']);
        }
    }

    //指定输入类型 header('Content-type:'.$info['mime']); 
    //动态的输出图片到浏览器中 
    $func = "image{$type}"; 
    $result = $func($image,"/tmp/{$filename}.{$type}"); 
    //销毁图片 
    imagedestroy($image);
    if ($waterImgConfig) {
        foreach ($src_img_arr as $srcimg) {
            imagedestroy($srcimg);
        }
    }
    return $result?"/tmp/{$filename}.{$type}":$result;
}