PHP中给图片添加水印

有些站点也许是出于推广或者防盗的目的在上传图片时给图片加上一个 LOGO 水印,我就见过有些站长直接用图片工具添加水印然后再上传,当然这样也能实现效果。但 PHP 中也可以完成给图片加水印的功能。就 PHP 函数功能这里就不再去浪费口舌介绍了,直接说下如何实现。大体有以下步骤

一、准备好 LOGO 图

这个 LOGO 图不限格式,gif 或 png 或 jpg 都可以,大小调成合适的即可。透明度不需要,因为我们可以在 PHP 中灵活设置透明度。如果不会使用制图工具制作 LOGO 可以去谷歌一下在线 LOGO 制作,随便点击进入一个链接敲几个字即可生成,当然是免费的。

二、写水印类

为什么要写成类,这是趋于人类思想,也方便使用维护。这里重点给出以下函数名,也就是实现水印功能主要就是靠这些函数功能操作

imagecreatefromjpeg // 打开 JPG 图片
imagecreatefromgif    // 打开 GIF 图片
imagecreatefrompng // 打开 PNG 图片
imagecreatefromwbmp // 打开 WBMP 图片(比较少用)
getimagesize // 获取图片大小信息
imagecopymerge // 把多张图片整合(添加水印的主要函数)
imagejpeg // 保存 JPG 图片
imagegif    // 保存 GIF 图片
imagepng // 保存 PNG 图片

完成以上步骤以后,你就可以给你上传的图片添加水印了。以下是我写的一个小 DEMO

水印类

<?php
/**
 * 加水印类
 * 沈唁志
 */
 
class water{
 
 private $imgPath; // 图片路径
 
 public function __construct($imgPath="./"){
 $this->imgPath = rtrim($imgPath,"/")."/";
 }
 
 // 写水印动作
 public function waterInfo($ground,$water,$pos=0,$prefix="lee_",$tm=50){
 $allPathGround = $this->imgPath.$ground;
 $allPathWater = $this->imgPath.$water;
 $groundInfo = $this->imgInfo($allPathGround); 
 $waterInfo = $this->imgInfo($allPathWater);
 
 //判断水印图片是否比原图大
 if(!$newPos=$this->imgPos($groundInfo,$waterInfo,$pos)){
 echo "您的水印图片比原图大哦"; 
 return false;
 }
 
 //打开资源
 $groundRes=$this->imgRes($allPathGround,$groundInfo['mime']);
 $waterRes=$this->imgRes($allPathWater,$waterInfo['mime']);
 
 //整合资源
 $newGround=$this->imgCopy($groundRes,$waterRes,$newPos,$waterInfo,$tm);
 
 //保存资源
 $this->saveImg($newGround,$ground,$groundInfo['mime'],$prefix);
 
 }
 
 private function saveImg($img,$ground,$info,$prefix){
 $path=$this->imgPath.$prefix.$ground;
 switch($info){
 case "image/jpg": 
 case "image/jpeg":
 case "image/pjpeg":
 imagejpeg($img,$path);
 break;
 case "image/gif":
 imagegif($img,$path);
 break;
 case "image/png":
 imagepng($img,$path);
 break;
 default:
 imagegd2($img,$path); 
 } 
 }
 
 private function imgCopy($ground,$water,$pos,$waterInfo,$tm){ 
 imagecopymerge($ground,$water,$pos[0],$pos[1],0,0,$waterInfo[0],$waterInfo[1],$tm);
 return $ground;
 }
 
 private function imgRes($img,$imgType){
 switch($imgType){
 case "image/jpg": 
 case "image/jpeg":
 case "image/pjpeg":
 $res=imagecreatefromjpeg($img);
 break;
 case "image/gif":
 $res=imagecreatefromgif($img);
 break;
 case "image/png":
 $res=imagecreatefrompng($img);
 break;
 case "image/wbmp":
 $res=imagecreatefromwbmp($img);
 break;
 default:
 $res=imagecreatefromgd2($img);
 } 
 return $res;
 }
 
 // 位置为
 // 1 左上 2 中上 3 右上
 // 4 左中 5 中中 6 右中
 // 7 左下 8 中下 9 右下
 // 0 随机位置
 private function imgPos($ground,$water,$pos){
 if($ground[0]<$water[0] || $ground[1]<$water[1]) //判断水印与原图比较 如果水印的高或者宽比原图小 将返回假
 return false;
 switch($pos){
 case 1:
 $x=0;
 $y=0;
 break;
 case 2:
 $x=ceil(($ground[0]-$water[0])/2);
 $y=0;
 break;
 case 3: 
 $x=$ground[0]-$water[0];
 $y=0;
 break;
 case 4:
 $x=0;
 $y=ceil(($ground[1]-$water[1])/2);
 break;
 case 5:
 $x=ceil(($ground[0]-$water[0])/2);
 $y=ceil(($ground[1]-$water[1])/2);
 break;
 case 6:
 $x=$ground[0]-$water[0];
 $y=ceil(($ground[1]-$water[1])/2);
 break;
 case 7:
 $x=0;
 $y=$ground[1]-$water[1];
 break;
 case 8:
 $x=ceil($ground[0]-$water[0]/2);
 $y=$ground[1]-$water[1];
 break;
 case 9:
 $x=$ground[0]-$water[0];
 $y=$ground[1]-$water[1];
 break;
 case 0:
 default:
 $x=rand(0,$ground[0]-$water[0]);
 $y=rand(0,$ground[1]-$water[1]);
 }
 $xy[]=$x;
 $xy[]=$y;
 return $xy; 
 }
 
 // 获取图片信息的函数
 private function imgInfo($img){
 return getimagesize($img); 
 }
}
?> 

使用页面

<?php
 // 包含类文件
include("water.class.php"); 
 
// 可以传进一个添加水印后保存的路径,路径相对于类脚本
// 如果为空则默认是脚本当前路径
$water=new water(); 
 
// 参数:
// 1. 源图 
// 2. 水印图 即 LOGO
// 3. 位置 
// 位置为
// 1 左上 2 中上 3 右上
// 4 左中 5 中中 6 右中
// 7 左下 8 中下 9 右下
// 0 随机位置
 // 4. 保存添加水印图片的文件名前缀 
// 5. 透明度
$water->waterInfo("02.jpg","01.jpg",9,"haha",20);
 
?>

3 条评论

发表评论

*