计应134(实验班)   詹加全

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

一、准备好LOGO图

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

二、写水印类

为什么要写成类,这是趋于人类思想,也方便使用维护。这里重点给出以下函数名,也就是实现水印功能主要就是靠这些函数功能操作
1.imagecreatefromjpeg // 打开JPG图片 2.imagecreatefromgif    // 打开GIF图片
3.imagecreatefrompng // 打开PNG图片
4.imagecreatefromwbmp // 打开WBMP图片(比较少用)
5.getimagesize // 获取图片大小信息
6.imagecopymerge // 把多张图片整合(添加水印的主要函数)
7.imagejpeg // 保存JPG图片
8.imagegif    // 保存GIF图片
9.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);
 

?>

给图片添加水印除了用基础的GD库实现,其实还可以ImageMagick这个工具,它的功能更强大,不过一般没多大需求,就用上面这个代码了。