您的位置:首页 > 编程语言 > PHP开发

PHP 上传图片添加水印

2015-09-25 16:33 786 查看
<?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>

效果如下:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: