php图片水印类

<?php
class Image {
    private $path;
    //构造方法用来对图片所在位置进行初使化
    function __construct($path="./"){
        $this->path=rtrim($path, "/")."/";
        $this -> path = '';
    }
    /* 对图片进行缩放
     *
     * 参数$name: 是需要处理的图片名称
     * 参数$width:是缩放后的宽度
     * 参数$height:是缩放后的高度
     * 参数$qz: 是新图片的名称前缀
     * 返回值:就是缩放后的图片名称,失败则返回false
     *
     */
    function thumb($name, $width, $height, $qz="th_"){
        //获取图片信息
        $imgInfo=$this->getInfo($name); //图片的宽度,高度,类型
        //获取图片资源, 各种类型的图片都可以创建资源 jpg, gif, png
        $srcImg=$this->getImg($name, $imgInfo);
        //获取计算图片等比例之后的大小, $size["width"], $size["height"]
        $size=$this->getNewSize($name, $width, $height, $imgInfo);
        //获取新的图片资源, 处理一下gif透明背景
        $newImg=$this->kidOfImage($srcImg, $size, $imgInfo);
        //另存为一个新的图片,返回新的缩放后的图片名称    
        return $this->createNewImage($newImg, $qz.$name, $imgInfo);    
    }

    private function createNewImage($newImg, $newName, $imgInfo){
        switch($imgInfo["type"]){
        case 1://gif
            Header("Content-type: image/gif");
            $result=imageGif($newImg);
            break;
        case 2://jpg
            Header("Content-type: image/jpg");
            $result=imageJPEG($newImg);
            break;
        case 3://png
            Header("Content-type: image/png");
            $return=imagepng($newImg);
            break;
        }
        imagedestroy($newImg);
        return $newName;
    }

    private function kidOfImage($srcImg, $size, $imgInfo){
        $newImg=imagecreatetruecolor($size["width"], $size["height"]);

        $otsc=imagecolortransparent($srcImg);

        if($otsc >=0 && $otsc <= imagecolorstotal($srcImg)){
            $tran=imagecolorsforindex($srcImg, $otsc);

            $newt=imagecolorallocate($newImg, $tran["red"], $tran["green"], $tran["blue"]);

            imagefill($newImg, 0, 0, $newt);

            imagecolortransparent($newImg, $newt);
        }

        imagecopyresized($newImg, $srcImg, 0, 0, 0, 0, $size["width"], $size["height"], $imgInfo["width"], $imgInfo["height"]);

        imagedestroy($srcImg);

        return $newImg;
    }

    private function getNewSize($name, $width, $height, $imgInfo){
        $size["width"]=$imgInfo["width"];
        $size["height"]=$imgInfo["height"];

        //缩放的宽度如果比原图小才重新设置宽度
        if($width < $imgInfo["width"]){
            $size["width"]=$width;
        }
        //缩放的高度如果比原图小才重新设置高度
        if($height < $imgInfo["height"]){
            $size["height"]=$height;
        }

        //图片等比例缩放的算法
        if($imgInfo["width"]*$size["width"] > $imgInfo["height"] * $size["height"]){
            $size["height"]=round($imgInfo["height"]*$size["width"]/$imgInfo["width"]);
        }else{
            $size["width"]=round($imgInfo["width"]*$size["height"]/$imgInfo["height"]);
        }


        return $size;

    }

    public function getInfo($name){
        $data=getImageSize($this->path.$name);

        $imageInfo["width"]=$data[0];
        $imageInfo["height"]=$data[1];
        $imageInfo["type"]=$data[2];

        return $imageInfo;
    }

    private function getImg($name, $imgInfo){
        $srcPic=$this->path.$name;

        switch($imgInfo["type"]){
        case 1: //gif
            $img=imagecreatefromgif($srcPic);
            break;
        case 2: //jpg
            $img=imageCreatefromjpeg($srcPic);
            break;
        case 3: //png
            $img=imageCreatefrompng($srcPic);
            break;
        default:
            return false;

        }

        return $img;
    }
    /* 功能:为图片加水印图片
     * 参数$groundName: 背景图片,即需要加水印的图片
     * 参数$waterName: 水钱图片
     * 参数#aterPost:水印位置, 10种状态, 
     *  0为随机位置
     *
     *  1. 为顶端居左  2. 为顶端居中  3 为顶端居右
     *  4  为中部居左  5. 为中部居中  6 为中部居右
     *  7 . 为底端居左 8. 为底端居中, 9. 为底端居右
     *
     * 参数$qz : 是加水印后的图片名称前缀
     * 返回值:就是处理后图片的名称
     *
     */
    function waterMark($groundName, $waterName, $waterPos=0, $qz="wa_"){


        $groundInfo=$this->getInfo($groundName);
        $waterInfo=$this->getInfo($waterName);
        //水印的位置
        if(!$pos=$this->position($groundInfo, $waterInfo, $waterPos)){
            return "Picture too small!";
        }

        $groundImg=$this->getImg($groundName, $groundInfo);
        $waterImg=$this->getImg($waterName, $waterInfo);

        $groundImg=$this->copyImage($groundImg, $waterImg, $pos, $waterInfo);

        return $this->createNewImage($groundImg, $qz.$groundName, $groundInfo);

    }

    private function copyImage($groundImg, $waterImg, $pos, $waterInfo){
        imagecopy($groundImg, $waterImg, $pos["posX"], $pos["posY"], 0, 0, $waterInfo["width"], $waterInfo["height"]);
        imagedestroy($waterImg);

        return $groundImg;
    }

    private function position($groundInfo, $waterInfo, $waterPos){
        //需要背景比水印图片大
        if(($groundInfo["width"]< $waterInfo["width"]) ||($groundInfo["height"] < $waterInfo["height"])){
            return false;
        }

        switch($waterPos){
        case 1:
            $posX=0;
            $posY=0;
            break;
        case 2:
            $posX=($groundInfo["width"]-$waterInfo["width"])/2;
            $posY=0;
            break;
        case 3:
            $posX=$groundInfo["width"]-$waterInfo["width"];
            $posY=0;
            break;
        case 4:
            $posX=0;
            $posY=($groundInfo["height"]-$waterInfo["height"]) /2;
            break;
        case 5:
            $posX=($groundInfo["width"]-$waterInfo["width"])/2;
            $posY=($groundInfo["height"]-$waterInfo["height"]) /2;
            break;
        case 6:
            $posX=$groundInfo["width"]-$waterInfo["width"];
            $posY=($groundInfo["height"]-$waterInfo["height"]) /2;
            break;
        case 7:
            $posX=0;
            $posY=$groundInfo["height"]-$waterInfo["height"];
            break;
        case 8:
            $posX=($groundInfo["width"]-$waterInfo["width"])/2;
            $posY=$groundInfo["height"]-$waterInfo["height"];
            break;
        case 9:
            $posX=$groundInfo["width"]-$waterInfo["width"];
            $posY=$groundInfo["height"]-$waterInfo["height"];
            break;
        case 0:
        default:
        $posX=rand(0, ($groundInfo["width"]-$waterInfo["width"]));
        $posY=rand(0, ($groundInfo["height"]-$waterInfo["height"]));
        break;
        }

        return array("posX"=>$posX, "posY"=>$posY);
    }

}

 

posted @ 2015-06-25 14:45  arvim  阅读(321)  评论(0编辑  收藏  举报