18-文件上传+生成缩略图+水印效果

很多新闻网站上新闻图片全部都添加了水印效果,其目的就是为了防止盗链的情况产生。所以,我们今天将上一篇博文进行升级---添加水印效果!!

为图片添加水印的效果总体分为两大类:添加文字(又具体的分为中文和英文)和添加Logo

一、 添加文本

添加文本的原理非常简单,就是通过imagettftext在原来图像上的书写文本
我们先来固定一幅特定的图片,然后在上面来书写几个字符吧!
原图如下:
 

 
代码如下:
 
 
<?php

$file = "./01.jpg";

$imageResource = imagecreatefromjpeg($file);

$imgWidth = imagesx($imageResource);

$imgHeight = imagesy($imageResource);

$white = imagecolorallocate($imageResource,255,255,255);

$text = "wuhua Blog";

$fontfile = "verdana.ttf";

$x = $imgWidth - 180;

$y = $imgHeight - 30;

imagettftext ($imageResource,20,0,$x,$y,$white,$fontfile,$text);
imagejpeg($imageResource,"watermark_01.jpg");

imagedestroy($imageResource);

?>
 
 
效果图如下:
 

 
我们再来添加几个汉字吧!看起来也就是将英文字母换成汉字的问题!
 
源码如下:

<?php

$file = "./01.jpg";

$imageResource = imagecreatefromjpeg($file);
 
$imgWidth = imagesx($imageResource);

$imgHeight = imagesy($imageResource);

$white = imagecolorallocate($imageResource,255,255,255);

$text = "吴华博客";

$fontfile = "STXINWEI.TTF";

$x = $imgWidth - 180;

$y = $imgHeight - 30;

imagettftext ($imageResource,30,0,$x,$y,$white,$fontfile,$text);
imagejpeg($imageResource,"watermark_01.jpg");

imagedestroy($imageResource);

?>
 
可是运行以后,效果图却是这样的!
 

 
唉,这是怎么了,难道代码有错误吗?检查一遍后,没有错误呀!啊,原来是字符编码的问题!

好了!只要将字符编码转换一下就可以了,所以,更改后的代码如下:
 
<?php

$file = "./01.jpg";

$imageResource = imagecreatefromjpeg($file);

$imgWidth = imagesx($imageResource);

$imgHeight = imagesy($imageResource);

$white = imagecolorallocate($imageResource,255,255,255);

$text = "吴华博客";

$fontfile = "STXINWEI.TTF";

$text = iconv("gb2312","utf-8",$text);

$x = $imgWidth - 180;

$y = $imgHeight - 30;

imagettftext ($imageResource,30,0,$x,$y,$white,$fontfile,$text);
imagejpeg($imageResource,"watermark_01.jpg");

imagedestroy($imageResource);

?>
 
效果图如下:
 
 

 
二、 添加Logo

我们就拿新浪的Logo为例吧!此时我们需要到imagecopymerge函数

源代码如下:
 
<?php

$file = "./01.jpg";

$logoFile = "./logo.gif";

$spacer = 15;

$imageResource = imagecreatefromjpeg($file);

$imgWidth = imagesx($imageResource);

$imgHeight = imagesy($imageResource);

$logoResource = imagecreatefromgif($logoFile);

$logoWidth = imagesx($logoResource);

$logoHeight = imagesy($logoResource);

imagecopymerge($imageResource,$logoResource,($imgWidth-$logoWidth-$spacer),($imgHeight-$logoHeight-$spacer),0,0,$logoWidth,$logoHeight,100);

imagejpeg($imageResource,"watermark_01.jpg");

imagedestroy($imageResource);

?>
 
效果如下:
 

 
三、 文件上传+生成缩略图+水印效果

操作步骤如下:

1. 创建图形化的用户界面(如下图)
 

 
2. 上传文件并添加水印

<?php

$filename = $_FILES["file"]["name"];

$tmpName = $_FILES["file"]["tmp_name"];

$errCode = $_FILES["file"]["error"];

$scalePercent = 0.5;

if($errCode == 0)

{

 list($imgWidth,$imgHeight,$imgType) = getimagesize($tmpName);

 $destWidth = ceil($imgWidth * $scalePercent);

 $destHeight = ceil($imgHeight * $scalePercent);

 $destImage = imagecreatetruecolor($destWidth,$destHeight);
 if($imgType == 1)

 {

  $createImage = "imagecreatefromgif";

  $outImage = "imagegif";

 }

 elseif ($imgType == 2)

 {

  $createImage = "imagecreatefromjpeg";

  $outImage = "imagejpeg";

 }

 elseif ($imgType == 3)

 {

  $createImage = "imagecreatefrompng";

  $outImage = "imagepng";

 }

 else

 {

  echo("文件类型错误!");

  exit;

 }

 $imageResource = $createImage($tmpName);

 imagecopyresampled($destImage,$imageResource,0,0,0,0,$destWidth,$destHeight,$imgWidth,$imgHeight);

 $text = "Wuhua Blog";

 $fontfile = "verdana.ttf";

 $x = ($destWidth - 200);

 $y = ($destHeight - 35);

 $white = imagecolorallocate($destImage,255,255,255);

 imagettftext ($destImage,20,0,$x,$y ,$white,$fontfile,$text);

 $outImage($destImage,"watermark_{$filename}");

 imagedestroy($imageResource);

 imagedestroy($destImage);

}

?>
 
具体的例子在附件中!
 
另外,因为51CTO中的附件字节数不能超过2MB,所以在案例2中将字体省略了!