<?
/* 
* 功能：PHP图片水印 (水印支持图片或文字) 
* 参数： 
* $groundImage 背景图片，即需要加水印的图片，暂只支持GIF,JPG,PNG格式； 
* $waterPos 水印位置，有10种状态，0为随机位置； 
* 1为顶端居左，2为顶端居中，3为顶端居右； 
* 4为中部居左，5为中部居中，6为中部居右； 
* 7为底端居左，8为底端居中，9为底端居右； 
* $waterImage 图片水印，即作为水印的图片，暂只支持GIF,JPG,PNG格式； 
* $waterText 文字水印，即把文字作为为水印，支持ASCII码，不支持中文； 
* $textFont 文字大小，值为1、2、3、4或5，默认为5； 
* $textColor 文字颜色，值为十六进制颜色值，默认为#FF0000(红色)； 
* 
* 注意：Support GD 2.0，Support FreeType、GIF Read、GIF Create、JPG 、PNG 
* $waterImage 和 $waterText 最好不要同时使用，选其中之一即可，优先使用 $waterImage。 
* 当$waterImage有效时，参数$waterString、$stringFont、$stringColor均不生效。 
* 加水印后的图片的文件名和 $groundImage 一样。 
* 作者：longware @ 2004-11-3 14:15:13 
*/
function imageWaterMark($groundImage, $waterPos = 0, $waterImage = "", $waterText = "", $textFont = 5, $textColor = "#FF0000"){
	$isWaterImage = FALSE;
	$formatMsg = "暂不支持该文件格式，请用图片处理软件将图片转换为GIF、JPG、PNG格式。";
	
	//读取水印文件 
	if (!empty($waterImage) && file_exists($waterImage))
	{
		$isWaterImage = false;
		$water_info = getimagesize($waterImage);
		$water_w = $water_info[0]; //取得水印图片的宽 
		$water_h = $water_info[1]; //取得水印图片的高 
	
	
		switch($water_info[2]) //取得水印图片的格式 
		{
			case 1 :
				$water_im = imagecreatefromgif($waterImage);
				break;
			case 2 :
				$water_im = imagecreatefromjpeg($waterImage);
				break;
			case 3 :
				$water_im = imagecreatefrompng($waterImage);
				break;
			default :
				die($formatMsg);
		}
	}

	//读取背景图片 
	if (!empty($groundImage) && file_exists($groundImage))
	{
		$ground_info = getimagesize($groundImage);
		$ground_w = $ground_info[0]; //取得背景图片的宽 
		$ground_h = $ground_info[1]; //取得背景图片的高
		
		switch($ground_info[2]) //取得背景图片的格式 
		{
			case 1 :
				$ground_im = imagecreatefromgif($groundImage );
				break;
			case 2 :
				$ground_im = imagecreatefromjpeg($groundImage );
				break;
			case 3 :
				$ground_im = imagecreatefrompng($groundImage );
				break;
			default :
				die($formatMsg);
		}
	}
	else
	{
		die("需要加水印的图片不存在！");
	}

	//水印位置 
	if ($isWaterImage) //图片水印 
	{
		$w = $water_w;
		$h = $water_h;
		$label = "图片的";
	}
	else //文字水印 
	{
		$temp = imagettfbbox(ceil($textFont * 5), 0, "times.ttf", $waterText); //取得使用 TrueType 字体的文本的范围 
		$w = $temp[2] - $temp[6];
		$h = $temp[3] - $temp[7];
		//  $w = $temp [4] - $temp [6];
		//  $h = $temp [1] - $temp [7];
		unset($temp);
		$label = "文字区域";
	}
	
	if (($ground_w < $w) || ($ground_h < $h))
	{
		echo "需要加水印的图片的长度或宽度比水印" . $label . "还小，无法生成水印！";
		return;
	}
	switch($waterPos)
	{
		case 0 : //随机 
			$posX = rand(0, ($ground_w - $w));
			$posY = rand(0, ($ground_h - $h));
			break;
		case 1 : //1为顶端居左 
			$posX = 0;
			$posY = 0;
			break;
		case 2 : //2为顶端居中 
			$posX = ($ground_w - $w)/2;
			$posY = 0;
			break;
		case 3 : //3为顶端居右 
			$posX = $ground_w - $w;
			$posY = 0;
			break;
		case 4 : //4为中部居左 
			$posX = 0;
			$posY = ($ground_h - $h)/2;
			break;
		case 5 : //5为中部居中 
			$posX = ($ground_w - $w)/2;
			$posY = ($ground_h - $h)/2;
			break;
		case 6 : //6为中部居右 
			$posX = $ground_w - $w;
			$posY = ($ground_h - $h)/2;
			break;
		case 7 : //7为底端居左 
			$posX = 0;
			$posY = $ground_h - $h;
			break;
		case 8 : //8为底端居中 
			$posX = ($ground_w - $w)/2;
			$posY = $ground_h - $h;
			break;
		case 9 : //9为底端居右 
			$posX = $ground_w - $w;
			$posY = $ground_h - $h;
			break;
		default : //随机 
			$posX = rand(0, ($ground_w - $w));
			$posY = rand(0, ($ground_h - $h));
			break;
	}

	//设定图像的混色模式 
	imagealphablending($ground_im, true);

	if ($isWaterImage) //图片水印 
	{
		imagecopy ( $ground_im, $water_im, $posX, $posY, 0, 0, $water_w, $water_h ); //拷贝水印到目标文件 
	}
	else //文字水印 
	{
		if (!empty($textColor) && (strlen($textColor) == 7))
		{ //颜色代码#XXXXXX格式所以不能少于7位
			$R = hexdec(substr($textColor, 1, 2));
			$G = hexdec(substr($textColor, 3, 2));
			$B = hexdec(substr($textColor, 5));
		}else{
			die("水印文字颜色格式不正确！");
		}
		//imagestring ( $ground_im, $textFont, $posX, $posY, $waterText, imagecolorallocate ( $ground_im, $R, $G, $B ) );
		//imagestring($image, $font, $x, $y, $string, $color)
		//imagettftext($image, $size, $angle, $x, $y, $color, $fontfile, $text)
	
		imagettftext($ground_im, ceil($textFont * 5), 0, 10, $ground_h - $h, imagecolorallocate($ground_im, $R, $G, $B), "times.ttf", $waterText);
		
		//iconv("UTF-8","GB2312",$waterText)
	}

	//生成水印后的图片 
	@unlink($groundImage);
	switch($ground_info[2]) //取得背景图片的格式 
	{
		case 1 :
			imagegif($ground_im, $groundImage);
			break;
		case 2 :
			imagejpeg($ground_im, $groundImage);
			break;
		case 3 :
			imagepng($ground_im, $groundImage);
			break;
		default :
			die($errorMsg);
	}

	//释放内存 
	if(isset($water_info))
		unset($water_info);
	if(isset($water_im))
		imagedestroy($water_im);
	unset($ground_info);
	imagedestroy($ground_im);
}

function imageCrop($pic,$newwidth=150,$imageZoom=true){
	$posx = 0;
	$posy = 0;
	
	$imginfo = getimagesize($pic);
	if($imginfo[0] > $imginfo[1]){
		$newpicw = $imginfo[1];
		$posx = ($imginfo[0] - $imginfo[1]) / 2;
	}else{
		$newpicw = $imginfo[0];
		$posy = ($imginfo[1] - $imginfo[0]) / 2;
	}
	if(!$imageZoom)
		$newwidth = $newpicw;
	switch($imginfo[2]){
		case 1:
			$im = imagecreatefromgif($pic);
			break;
		case 2:
			$im = imagecreatefromjpeg($pic);
			break;
		case 3:
			$im = imagecreatefrompng($pic);
			break;
	}
	$newim = imagecreatetruecolor($newwidth,$newwidth);
	imagecopyresampled($newim,$im,0,0,$posx,$posy,$newwidth,$newwidth,$newpicw,$newpicw);
	
	$newpic = $pic;
	
	if(strrpos($pic,"/") === false){
		
	}else{
		$newpic = "ico_".substr($pic,strrpos($pic,"/")+1);
		$newpic = substr($pic,0,strrpos($pic,"/"))."/".$newpic;
	}
	
	switch($imginfo[2]){
		case 1:
			imagegif($newim,$newpic);
			break;
		case 2:
			imagejpeg($newim,$newpic);
			break;
		case 3:
			imagepng($newim,$newpic);
			break;
	}
	imagedestroy($newim);
	imagedestroy($im);
}

function imageZoom($pic,$newpicw = 750){
	$imginfo = getimagesize($pic);
	if($imginfo[0] <= $newpicw)
		return;
	$newpich = intval($newpicw * $imginfo[1] / $imginfo[0]);
	
	switch($imginfo[2]){
		case 1:
			$im = imagecreatefromgif($pic);
			break;
		case 2:
			$im = imagecreatefromjpeg($pic);
			break;
		case 3:
			$im = imagecreatefrompng($pic);
			break;
	}
	
	$newim = imagecreatetruecolor($newpicw,$newpich);
	imagecopyresampled($newim,$im,0,0,0,0,$newpicw,$newpich,$imginfo[0],$imginfo[1]);
	
	switch($imginfo[2]){
		case 1:
			imagegif($newim,$pic);
			break;
		case 2:
			imagejpeg($newim,$pic);
			break;
		case 3:
			imagepng($newim,$pic);
			break;
	}
	imagedestroy($newim);
	imagedestroy($im);
}
?>