zoukankan      html  css  js  c++  java
  • php图片水印类

    <?php
    class Image {
        private $path;
        //构造方法用来对图片所在位置进行初使化
        function __construct($path="./"){
            $this->path=rtrim($path, "/")."/";
            $this -> path = '';
        }
        /* 对图片进行缩放
         *
         * 参数$name: 是需要处理的图片名称
         * 参数$是缩放后的宽度
         * 参数$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);
        }
    
    }
  • 相关阅读:
    IO流
    myEclipse的使用
    单例模式
    日期的使用
    String类的常用方法
    break、continue和return的区别
    包装类和随机数
    enum类的使用
    Java基础概念性的知识总结
    汇编中的函数调用与递归
  • 原文地址:https://www.cnblogs.com/luowen/p/4599957.html
Copyright © 2011-2022 走看看