首页 > PHP专栏 > PHP添加图片水印和文字水印
2016
08-11

PHP添加图片水印和文字水印

include("../framework/library/qrcode/phpqrcode.php");

//背景图片
$bgimg = MODULE_URL."template/mobile/images/share-qrcode-bgimg.jpg";

//二维码图片
$errorCorrectionLevel = 'L';  // 纠错级别:L、M、Q、H 
$matrixPointSize = 7;  // 点的大小:1到10

$qrcode = $dirpath.$uniacid."_".$openid."_qrcode".'.png'; // 生成的文件名
QRcode::png($infourl, $qrcode, $errorCorrectionLevel, $matrixPointSize, 2);

//合成二维码
$savefield = $this->img_water_mark($bgimg, $qrcode, $dirpath, $uniacid."_".$openid.".png", "50", "180");

//合成头像
$avatar = $this->saveImage(substr($member['avatar'], 0, -3)."64.jpg", $dirpath.$uniacid."_".$openid."_avatar");
$savefield = $this->img_water_mark($savefield, $dirpath.$uniacid."_".$openid."_avatar64.jpg",
 "../attachment/images/fy_lesson/", $uniacid."_".$openid."_ok.png", "50", "30");

//合成昵称
$info = getimagesize($savefield);  
//通过编号获取图像类型  
$type = image_type_to_extension($info[2],false);  
//在内存中创建和图像类型一样的图像  
$fun = "imagecreatefrom".$type;  
//图片复制到内存  
$image = $fun($savefield);  
  
//设置字体的路径  
$font = "../addons/fy_lesson/template/mobile/ttf/yahei.ttf";  
//设置字体颜色和透明度  
$color = imagecolorallocatealpha($image, 216, 79, 37, 0);  
//写入文字
$fun = $dirpath.$uniacid."_".$openid.".png";
imagettftext($image, 19, 0, 215, 70, $color, $font, $member['nickname']);  
//保存图片
$fun = "image".$type;
$okfield = $dirpath.$uniacid."_".$openid."_ok.png";
$fun($image, $okfield);  
/*销毁图片*/  
imagedestroy($image);

水印公共方法:

if(!preg_match('/\/([^\/]+\.[a-z]{3,4})$/i',$path,$matches)){
		die('Use image please');
	}
	
	$image_name = strToLower($matches[1]);
	$ch = curl_init ($path);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
	curl_setopt($ch, CURLOPT_BINARYTRANSFER,1);
	$img = curl_exec ($ch);
	curl_close ($ch);
	$fp = fopen($file_dir.$image_name,'w');
	fwrite($fp, $img);
	fclose($fp);
}

/**
 * 图片加水印(适用于png/jpg/gif格式)
 * 
 * @author flynetcn
 *
 * @param $srcImg 原图片
 * @param $waterImg 水印图片
 * @param $savepath 保存路径
 * @param $savename 保存名字
 * @param $positon 水印位置 
 * 
 * @return 成功 -- 加水印后的新图片地址
 *          失败 -- -1:原文件不存在, -2:水印图片不存在, -3:原文件图像对象建立失败
 *          -4:水印文件图像对象建立失败 -5:加水印后的新图片保存失败
 */
public function img_water_mark($srcImg, $waterImg, $savepath=null, $savename=null, $x, $y, $alpha=100){
	$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; //水印文件图像对象建立失败
	}

	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;
}


public 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;
}