zoukankan      html  css  js  c++  java
  • php 图片操作类,支持生成缩略图,添加水印,上传缩略图

    <?php
    /**
     * @author wolf
     *
     */
    class Image {
        //类开始
        public $originimage = ""; //源图片文件地址
        public $imageext = ""; //源图片格式
        public $thumbimage = ""; //缩略图文件存放地址
        public $thumb_maxwidth = 1440; //缩略图最大宽度
        public $thumb_maxheight = 900; //缩略图最大高度
        public $watermark_text = ""; //水印文字内容
        public $watermark_minwidth = 300; //源图片最小宽度:大于此值时加水印
        public $watermark_minheight = 200; //源图片最小高度:大于此值时加水印
        public $watermark_fontfile = ""; //字体文件
        public $watermark_fontsize = 14; //字体大小
        public $watermark_logo = "config/water.png"; //水印LOGO地址
        public $watermark_transparent = 20; //水印LOGO不透明度
        private $origin_width = 0; //源图片宽度
        private $origin_height = 0; //源图片高度
        private $imageQuilty = 90; //图片质量
        private $tmp_originimage = ""; //临时图片(源图片)
        private $tmp_thumbimage = ""; //临时图片(缩略图)
        private $tmp_waterimage = ""; //临时图片(水印LOGO)
        private $_waterPosition = 2; //1正中间 2右下角
        //生成缩略图
        public function gen_thumbimage() {
            if ($this->originimage == "" || $this->thumbimage == "") {
                return 0;
            }
            $this->get_oriwidthheight ();
            if ($this->origin_width < $this->thumb_maxwidth && $this->origin_height < $this->thumb_maxheight) {
                $this->thumb_maxwidth = $this->origin_width;
                $this->thumb_maxheight = $this->origin_height;
            } else {
                if ($this->origin_width < $this->origin_height) {
                    $this->thumb_maxwidth = ($this->thumb_maxheight / $this->origin_height) * $this->origin_width;
                } else {
                    $this->thumb_maxheight = ($this->thumb_maxwidth / $this->origin_width) * $this->origin_height;
                }
            }
            $this->get_imagetype ();
            $this->gen_tmpimage_origin ();
            $this->gen_tmpimage_thumb ();
            if ($this->tmp_originimage == "" || $this->tmp_thumbimage == "") {
                return - 1;
            }
            imagecopyresampled ( $this->tmp_thumbimage, $this->tmp_originimage, 0, 0, 0, 0, $this->thumb_maxwidth, $this->thumb_maxheight, $this->origin_width, $this->origin_height );
            switch ($this->imageext) {
                case "gif" :
                    imagegif ( $this->tmp_thumbimage, $this->thumbimage );
                    return 1;
                    break;
                case "jpg" :
                    imagejpeg ( $this->tmp_thumbimage, $this->thumbimage, $this->imageQuilty );
                    return 2;
                    break;
                case "png" :
                    imagepng ( $this->tmp_thumbimage, $this->thumbimage );
                    return 3;
                    break;
                default :
                    return - 2;
                    break;
            }
        }
        //添加文字水印
        public function add_watermark1() {
            if ($this->originimage == "" || $this->watermark_text == "" || $this->watermark_fontfile == "") {
                return 0;
            }
            $this->get_oriwidthheight ();
            if ($this->origin_width < $this->watermark_minwidth || $this->origin_height < $this->watermark_minheight) {
                return 0;
            }
            $this->get_imagetype ();
            $this->gen_tmpimage_origin ();
            if ($this->tmp_originimage == "") {
                return - 1;
            }
            $textcolor = imagecolorallocate ( $this->tmp_originimage, 255, 0, 0 );
            $angle = 0;
            $px = $this->origin_width / 2 - 200;
            $py = $this->origin_height / 2 - 10;
            imagettftext ( $this->tmp_originimage, $this->watermark_fontsize, $angle, $px, $py, $textcolor, $this->watermark_fontfile, $this->watermark_text );
            switch ($this->imageext) {
                case "gif" :
                    imagegif ( $this->tmp_originimage, $this->originimage );
                    return 1;
                    break;
                case "jpg" :
                    imagejpeg ( $this->tmp_originimage, $this->originimage, $this->imageQuilty );
                    return 2;
                    break;
                case "png" :
                    imagepng ( $this->tmp_originimage, $this->originimage );
                    return 3;
                    break;
                default :
                    return - 2;
                    break;
            }
        }
        //添加LOGO水印
        public function add_watermark2() {
            if ($this->originimage == "" || $this->watermark_logo == "") {
                return 0;
            }
            $this->get_oriwidthheight ();
            if ($this->origin_width < $this->watermark_minwidth || $this->origin_height < $this->watermark_minheight) {
                return 0;
            }
            $this->get_imagetype ();
            $this->gen_tmpimage_origin ();
            $this->gen_tmpimage_waterlogo ();
            if ($this->tmp_originimage == "" || $this->tmp_waterimage == "") {
                return - 1;
            }
            list ( $logo_width, $logo_height ) = getimagesize ( $this->watermark_logo );
            //正中间
            $waterZb = $this->waterPosition ( $logo_width, $logo_height );
            $px = $waterZb ['x'];
            $py = $waterZb ['y'];
            imagecopymerge ( $this->tmp_originimage, $this->tmp_waterimage, $px, $py, 0, 0, $logo_width, $logo_height, $this->watermark_transparent );
            switch ($this->imageext) {
                case "gif" :
                    imagegif ( $this->tmp_originimage, $this->originimage );
                    return 1;
                    break;
                case "jpg" :
                    imagejpeg ( $this->tmp_originimage, $this->originimage, $this->imageQuilty );
                    return 2;
                    break;
                case "png" :
                    imagepng ( $this->tmp_originimage, $this->originimage );
                    return 3;
                    break;
                default :
                    return - 2;
                    break;
            }
        }
          
        /**
         * 上传缩略图
         * 注意上传文件大小限制
         *@param String $files $_FILES['upload'] 类型
         *@param String  $path  存储的目录 默认在/static/attached/
         *@param boolean $isWater 是否添加水印
         * @return string $filePath 网页url图片路径
         */
        public function upload($files, $path, $isWater) {
            if (is_uploaded_file ( $files ['tmp_name'] )) {
                $upfile = $files;
                $name = $upfile [name];
                $type = $upfile [type];
                $size = $upfile [size];
                $tmp_name = $upfile [tmp_name];
                $error = $upfile [error];
                  
                if ($size > 1048576) {
                    return array ('status' => false, 'message' => "$name图片太大超过1MB" );
                }
                  
                $rs = $this->getImageSize ( $tmp_name );
                if (! $rs ['status']) {
                    $rs ['message'] = $name . $rs ['message'];
                    return $rs;
                }
                  
                // 创建文件夹
                $save_path = getcwd () . "/static/attached/" . $path . "/";
                $save_url = "./static/attached/" . $path . "/";
                $ym = date ( "Ym" );
                $save_path .= $ym . "/";
                $save_url .= $ym . "/";
                if (! file_exists ( $save_path )) {
                    mkdir ( $save_path );
                }
                  
                if ($error == '0') {
                    $fileType = substr ( $name, strpos ( $name, "." ) + 1 );
                    $prefix = $this->getRandPrefix ();
                    $newName = date ( "YmdHi" ) . $prefix . "." . $fileType;
                    $filepath = $save_path . $newName;
                    move_uploaded_file ( $tmp_name, $filepath );
                  
                }
                  
                if ($isWater) {
                    $this->water ( $filepath );
                }
                  
                return array ('status' => true, 'message' => $save_url . $newName );
            }
        }
          
        /**
         * 图片增加水印处理
         * @param unknown_type $image
         */
        public function water($image) {
            $this->watermark_logo = ROOT . $this->watermark_logo;
            $this->originimage = $image;
            //LOGO水印
            $this->add_watermark2 ();
        }
          
        /**
         * 
         * 获取随机前缀
         */
        private function getRandPrefix() {
            $string = "abcdefghijklmnopqrstuvwxyz0123456789";
            $prefix = '';
            for($i = 0; $i < 4; $i ++) {
                $rand = rand ( 0, 33 );
                $prefix .= $string {$rand};
            }
            return $prefix;
        }
          
        //检测图片大小
        private function getImageSize($image) {
            list ( $width, $height, $type, $attr ) = getimagesize ( $image );
              
            if ($type != 2 && $type != 3) {
                return array ('status' => false, 'message' => "图片格式不正确,请上传JPG或者PNG图片" . $type );
            }
            //检测图片大小
            if ($width > 1440) {
                return array ('status' => false, 'message' => "图片宽度请小于1440px,当前为" . $width . "px" );
            }
              
            if ($height > 900) {
                return array ('status' => false, 'message' => "图片高度请小于900px,当前为" . $height . "px" );
              
            }
            return array ('status' => true );
        }
          
        /**
         * 生成缩略图
         * 
         * @param String $imagefile 原始文件
         * @param String $thumbWidth  缩略图宽度
         * @param String $thumbHeight 缩略图高度
         * @return String 缩略图url         
         */
        public function reduceImage($imagefile, $thumbWidth, $thumbHeight, $path = "thumb") {
              
            // 生成缩略图
            $dir = date ( "Ym", time () );
            $imagefile = ROOT . $imagefile;
            $imagefile_s = ROOT . "static/attached/" . $path . "/" . $dir . "/s_" . basename ( $imagefile );
            $imagetrans = new Image ();
            $imagetrans->originimage = $imagefile;
            $imagetrans->thumbimage = $imagefile_s;
            $imagetrans->thumb_maxwidth = $thumbWidth;
            $imagetrans->thumb_maxheight = $thumbHeight;
            $isokid = $imagetrans->gen_thumbimage ();
              
            return "./static/attached/" . $path . "/" . $dir . "/s_" . basename ( $imagefile );
          
        }
        /**
         * 水印位置
         * @param int $logo_width
         * @param int $logo_height
         * @return 水印坐标
         */
        private function waterPosition($logo_width, $logo_height) {
            switch ($this->_waterPosition) {
                case 1 :
                    $px = $this->origin_width / 2 - $logo_width / 2;
                    $py = $this->origin_height / 2 - $logo_height / 2;
                    break;
                case 2 :
                    $px = $this->origin_width - $logo_width - 10;
                    $py = $this->origin_height - $logo_height - 10;
                    break;
                default :
                    $px = $this->origin_width / 2 - $logo_width / 2;
                    $py = $this->origin_height / 2 - $logo_height / 2;
                    break;
            }
              
            return array ('x' => $px, 'y' => $py );
        }
        //获取图片尺寸
        private function get_oriwidthheight() {
            list ( $this->origin_width, $this->origin_height ) = getimagesize ( $this->originimage );
            return 1;
        }
        /*
         * 检测图片格式
         * 原方法需要开启exif 扩展
         */
        private function get_imagetype() {
            $ext = $this->getImgext ( $this->originimage );
            switch ($ext) {
                case 1 :
                    $this->imageext = "gif";
                    break;
                case 2 :
                    $this->imageext = "jpg";
                    break;
                case 3 :
                    $this->imageext = "png";
                    break;
                default :
                    $this->imageext = "unknown";
                    break;
            }
        }
        //创建临时图片(源图片)
        private function gen_tmpimage_origin() {
            $ext = $this->getImgext ( $this->originimage );
            switch ($ext) {
                case 1 :
                    $this->tmp_originimage = imagecreatefromgif ( $this->originimage );
                    $bgcolor = imagecolorallocate ( $this->tmp_originimage, 0, 0, 0 );
                    $bgcolortrans = imagecolortransparent ( $this->tmp_originimage, $bgcolor );
                    break;
                case 2 :
                    $this->tmp_originimage = imagecreatefromjpeg ( $this->originimage );
                    break;
                case 3 :
                    $this->tmp_originimage = imagecreatefrompng ( $this->originimage );
                    imagesavealpha ( $this->tmp_originimage, true );
                    break;
                default :
                    $this->tmp_originimage = "";
                    break;
            }
        }
        //创建临时图片(缩略图)
        private function gen_tmpimage_thumb() {
            $ext = $this->getImgext ( $this->originimage );
            switch ($ext) {
                case 1 :
                    $this->tmp_thumbimage = imagecreatetruecolor ( $this->thumb_maxwidth, $this->thumb_maxheight );
                    $bgcolor = imagecolorallocate ( $this->tmp_thumbimage, 255, 255, 255 );
                    imagefill ( $this->tmp_thumbimage, 0, 0, $bgcolor );
                    break;
                case 2 :
                    $this->tmp_thumbimage = imagecreatetruecolor ( $this->thumb_maxwidth, $this->thumb_maxheight );
                    break;
                case 3 :
                    $this->tmp_thumbimage = imagecreatetruecolor ( $this->thumb_maxwidth, $this->thumb_maxheight );
                    $bgcolor = imagecolorallocate ( $this->tmp_thumbimage, 255, 255, 255 );
                    imagefill ( $this->tmp_thumbimage, 0, 0, $bgcolor );
                    imagealphablending ( $this->tmp_thumbimage, false );
                    imagesavealpha ( $this->tmp_thumbimage, true );
                    break;
                default :
                    $this->tmp_thumbimage = "";
                    break;
            }
        }
        //创建临时图片(LOGO水印)
        private function gen_tmpimage_waterlogo() {
            $ext = $this->getImgext ( $this->watermark_logo );
            switch ($ext) {
                case 1 :
                    $this->tmp_waterimage = imagecreatefromgif ( $this->watermark_logo );
                    $bgcolor = imagecolorallocate ( $this->tmp_waterimage, 0, 0, 0 );
                    $bgcolortrans = imagecolortransparent ( $this->tmp_waterimage, $bgcolor );
                    break;
                case 2 :
                    $this->tmp_waterimage = imagecreatefromjpeg ( $this->watermark_logo );
                    break;
                case 3 :
                    $this->tmp_waterimage = imagecreatefrompng ( $this->watermark_logo );
                    imagesavealpha ( $this->tmp_waterimage, true );
                    break;
                default :
                    $this->tmp_waterimage = "";
                    break;
            }
        }
        /*
         * 获取后缀名
         */
        public function getImgext($filename) {
            return exif_imagetype ( $filename );
        }
        //释放资源
        public function __destruct() {
            if (is_object ( $this->tmp_originimage ) == true) {
                imagedestroy ( $this->tmp_originimage );
            }
            if (is_object ( $this->tmp_thumbimage ) == true) {
                imagedestroy ( $this->tmp_thumbimage );
            }
            if (is_object ( $this->tmp_waterimage ) == true) {
                imagedestroy ( $this->tmp_waterimage );
            }
        }
    }
  • 相关阅读:
    c# 第29节 类
    c# 第28节 面向对象概述
    c# 第27节 结构、枚举
    c# 第26节 Main方法
    c# 第25节 方法重载
    Python接口自动化之yaml配置文件
    Python接口自动化之数据驱动
    Python接口自动化之登录接口测试
    测试面试题集-逻辑推理题
    Python接口自动化之unittest单元测试
  • 原文地址:https://www.cnblogs.com/shanyansheng/p/5172002.html
Copyright © 2011-2022 走看看