PHP图片批量添加水印
最近在做根据用户信息动态生成证书,遇到了很多问题,不过也都一一解决了。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;
}