PHP 上传图片添加水印

原创 2015年09月25日 16:33:45
<?php
	//为上传的图片加上水印
	/*
	*自定义添加水印处理函数makeImageWaterMark
	*$image  上传的图片(要添加水印效果的图片资源标识)
	*$pos  水印位置
	*$water_text  水印文字
	*$font_size 水印文字大小
	*$color 水印文字颜色
	*/
	function makeImageWaterMark($image,$pos,$water_text,$font_size,$color)
	{
		//获取TrueType字体
		$font_type = "C://WINDOWS//Fonts//SIMLI.TTF";

		//检查图片资源是否存在
		if (!empty($image) && file_exists($image))
		{
			//获取图像大小:返回一个具有四个单元的数组。索引 0 包含图像宽度的像素值,索引 1 包含图像高度的像素值。索引 2 是图像类型的标记:1 = GIF,2 = JPG,3 = PNG,4 = SWF,5 = PSD,6 = BMP,7 = TIFF(intel byte order),8 = TIFF(motorola byte order),9 = JPC,10 = JP2,11 = JPX,12 = JB2,13 = SWC,14 = IFF,15 = WBMP,16 = XBM。这些标记与 PHP 4.3.0 新加的 IMAGETYPE 常量对应。索引 3 是文本字符串,内容为“height="yyy" width="xxx"”,可直接用于 IMG 标记。
			$img_info = getimagesize($image);
			//获取背景图片的宽
			$g_w = $img_info[0];
			//获取背景图片的高
			$g_h = $img_info[1];

			//获取背景图片的格式
			switch ($img_info[2])
			{
				case 1:
					$img = imagecreatefromgif($image);
					break;
				
				case 2:
					$img = imagecreatefromjpeg($image);
					break;

				case 3:
					$img = imagecreatefrompng($image);
					break;

				default:
					die('图片格式错误!');
			}
		}
		else
		{
			die('需要加水印的图片不存在!');
		}

		/*
		*获取使用TrueType 字体的文字的范围
		*array imagettfbbox ( float $size , float $angle , string $fontfile , string $text )
		*float $size   字体大小
		*float $angle  将被度量的角度大小
		*string $fontfile   水印文字字体
		*string $text  水印文字
		*/
		$temp = imagettfbbox(ceil($font_size*2.5),0,$font_type,$water_text);
		$w = $temp[2] - $temp[6];
		$h = $temp[3] - $temp[7];

		//判断水印文字大小是否超过图片大小
		if(($g_w<$w) || ($g_h<$h))
		{
			echo '需要添加水印的图片大小比水印文字区域小,无法生成水印!';
			return;
		}


		/*
		*设置10种水印效果位置
		*0:默认是随机位置
		*1:顶端居左
		*2:顶端居中
		*3:顶端居右
		*4:中部居左
		*5:中部居中
		*6:中部居右
		*7:底端居左
		*8:底端居中
		*9:底端居右
		*/
		switch ($pos) {
			case 0:
				$pos_x = rand(0,($g_w - $w));
				$pos_y = rand(0,($g_h - $h));
				break;

			case 1:
				$pos_x = 0;
				$pos_y = 0;
				break;

			case 2:
				$pos_x = ($g_w - $w) / 2;
				$pos_y = 0;
				break;

			case 3:
				$pos_x = $g_w - $w;
				$pos_y = 0;
				break;

			case 4:
				$pos_x = 0;
				$pos_y = ($g_h - $h) / 2;
				break;

			case 5:
				$pos_x = ($g_w - $w) / 2;
				$pos_y = ($g_h - $h) / 2;
				break;

			case 6:
				$pos_x = $g_w - $w;
				$pos_y = ($g_h - $h) / 2;
				break;

			case 7:
				$pos_x = 0;
				$pos_y = $g_h - $h;
				break;

			case 8:
				$pos_x = ($g_w -$w) / 2;
				$pos_y = $g_h -$h;
				break;

			case 9:
				$pos_x = $g_w - $w;
				$pos_y = $g_h - $h;
				break;

			default:
				$pos_x = rand(0,($g_w - $w));
				$pos_y = rand(0,($g_h - $h));
				break;
		}

		//设置图像混色模式
		imagealphablending($img, true);


		if(!empty($color) && (strlen($color)==7))
		{
			$R = hexdec(substr($color,1,2));
			$G = hexdec(substr($color,3,2));
			$B = hexdec(substr($color,5));
		}

		//为一幅图像分配颜色
		$text_color = imagecolorallocate($img, $R, $G, $B);

		//用 TrueType 字体向图像写入文本
		imagettftext($img, $font_size, 0, $pos_x, $pos_y, $text_color, $font_type, $water_text);

		//获取背景图的格式
		switch ($img_info[2])
		{
			case 1:
				imagegif($img,$image);
				break;

			case 2:
				imagejpeg($img,$image);
				break;

			case 3:
				imagepng($img,$image);
				break;
			
			default:
				die('不被支持格式的图片');
		}

		imagedestroy($img);
	}

	/*
	*处理上传图片
	*当文件上传后将会把文件名修改,已当前时间戳和元文件组合作为新文件名
	*水印效果将会在新文件中生成
	*/
	if (isset($_FILES) && !empty($_FILES['userfile']) && $_FILES['userfile']['size']>0)
	{
		//将文件存放在同一目录下的upload文件夹中
		$upladfile = "./upload/".time()."_".$_FILES['userfile']['name'];
		//复制文件并加上水印文字并显示
		if(copy($_FILES['userfile']['tmp_name'], $upladfile))
		{
			///$str = "水印效果";//定义水印文字
			$str = $_POST['str'];
			makeImageWaterMark($upladfile,0,$str,16,"#43042A");
			echo "<img src=\"".$upladfile."\".border=\"0\"><br/><br/>";
		}
		else
		{
			echo '图片上传失败!';
		}
	}

?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>图片上传</title>

</head>

<body>
	<form enctype="multipart/form-data" method="post">
		输入您需要添加的水印文字:<input name="str" type="text" /><br/><br/>
		选择您需要添加水印的图片:<input name="userfile" type="file" /><br/><br/>
		<input type="submit" value="上传" />
		
	</form>
</body>
</html>

效果如下:


相关文章推荐

PHP实例解析:实现给上传图片加水印图案

用PHP给上传图片加水印的程序是通过判断文件类型建立图形,然后把其复制到原建立的图形上,填充并建立rectangle,以备写入imagestring()或是原已经定好的图像程序当中判断水印类型:一是字...

php给上传图片加图片水印

相信大家都知道怎么用PHP为图片增加文字水印,可是如果水印效果为图片呢?该怎么办?别担心,下文就为您分解 " method="post" enctype="multipart/for...

Asp.net上传图片并添加水印

  • 2010年06月10日 10:21
  • 176KB
  • 下载

ecshop编辑器kindeditor上传图片添加水印插件

很多人都觉得ecshop自带的编辑器不好用,wan

ASP.NET Ueditor上传图片添加水印

为Ueditor的本地上传图片添加水印的功能

利用工具类为ueditor上传图片添加水印(JSP版本)

今日需要实现图片添加水印功能,由于网站使用的编辑器是百度的开源编辑器ueditor,上网查询资料后发现很麻烦,需要修改的地方比较多,好吧,其实我是看不懂那些修改的代码。。。。。。。。。。。。。。。。。...

上传图片添加水印

把上传功能做到一个页面里,在需要上传的页面直接通过iframe调用即可: 调用页面代码: 图片:   上传页面代...

百度编辑器上传图片添加水印方法

最近做项目,用的是百度编辑器,客户有个要求,上传图片的时候批量添加水印,基本上说我是菜鸟型的,百度半天找了好些方法,都不对,最后找到一个方法,测试了下,暂时没问题,把它记录下来,供大家参考。 1、打...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:PHP 上传图片添加水印
举报原因:
原因补充:

(最多只允许输入30个字)