<?php

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 $namestrpos $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 );
        }
    }
}

php 图片操作类,支持生成缩略图,添加水印,上传缩略图的更多相关文章

  1. bootstrap-wysiwyg 结合 base64 解码 .net bbs 图片操作类

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Dr ...

  2. 适用于各浏览器支持图片预览,无刷新异步上传js插件

    文件上传无疑是web应用中一个非常常用的功能,不管是PHP.jsp还是aspx.mvc等都会需要文件上传,但是众所周知当使用自带的文件上传功能时总会出现页面刷新的情况.当然现在有了html5这个好东西 ...

  3. DedecmsV5.7本地上传缩略图无法自动添加水印的解决方法

    问题:dedecms后台 系统->图片水印设置 图片水印设置有开启了,但是本地上传缩略图无法自动添加水印 网上有很多资料,所以记录一下 1.打开dede(实际项目后台文件夹)/archives_ ...

  4. javascript 图片上传缩略图预览

    <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="C ...

  5. Dedecms本地上传缩略图无法自动添加水印的解决方法

    客户遇到一个问题,DEDECMS(V5.7)后台添加文档时,本地上传缩略图无法自动添加水印(系统设置里的图片水印设置没有问题),找了半天,终于找到了解决方法,留个记号: 打开dede/archives ...

  6. phpcms v9升级后台无法上传缩略图的原因分析

    phpcms V9 是目前国内使用人数最多的一款开源免费的CMS系统,正是由于他的免费性,开源性,以及其自身的功能性比较强大,所以倍受许多站长朋友们的亲来,以及许多的公司的喜欢.phpcms也为了完善 ...

  7. web自动化测试难点 滚动条操作、日期框处理、上传文件

    如何把页面滑到最低部? 一般来说,做web自动化测试时,不需要单独写代码,把页面滑到可见,因为click操作,只要是元素存在并且加载出来了,就可以点击到,无需另外写滑动元素的代码. 如果特殊情况需要滑 ...

  8. bootstrap-wysiwyg 结合 base64 解码 .net bbs 图片操作类 (二) 图片裁剪

    图片裁剪参见: http://deepliquid.com/projects/Jcrop/demos.php?demo=thumbnail        一个js插件 http://www.mikes ...

  9. C#——图片操作类简单封装

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Dr ...

随机推荐

  1. 2019.3.26判断是否回文(java实现)

    我所有的文章都是对我总结学习的总结,那里不好或者冒犯了那里,我先对您说声对不起,请告知我进行改正. 今天java老师作业题目是判断是一个字符串否是回文: emmmm,我的思路是将字符串逆序,然后使用方 ...

  2. Spring InitializingBean init-method @PostConstruct 执行顺序

    Spring 容器中的 Bean 是有生命周期的,Spring 允许在 Bean 在初始化完成后以及 Bean 销毁前执行特定的操作,常用的设定方式有以下三种:   通过实现 Initializing ...

  3. 夜色的 cocos2d-x 开发笔记 04

    本章会把游戏的基本功能结束,前面实现了子弹发射,产生敌人. 接下来我们要,检测子弹与敌人碰撞,让玩家移动,实现这个游戏的基本功能. 于是多出了这几个方法,当然还是写在.h文件里 首先实现触摸监听的方法 ...

  4. yum第三方源

    EPEL RHEL 6: http://dl.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm RHEL 7: http:// ...

  5. C#实现屏幕指定区域截屏

    //string Opath = @"C:/Picture";            //if (Opath.Substring(Opath.Length - 1, 1) != @ ...

  6. vos2009如何监听客户行业是否正规

    在对接被叫改写规则中将改写规则由原来0:9150 改为0:9150+自己手机号,这样客户打出话全转接到自己手机上,可以接听客户销售行业:

  7. JavaScript 编写随机四位数验证码(大小写字母和数字)

    1.JavaScript编写随机四位数验证码,用到的知识点为: a.Math对象的随机数:Math.random() b.Math对象的取整    :Math.floor() c.处理所需要的下标个数 ...

  8. 关于SAP UI5数据绑定我的一些原创内容

    如何查找SAP UI5官方关于数据绑定的文档: https://sapui5.hana.ondemand.com/ 点Documentation: Filter里输入data就能看到Data Bind ...

  9. Selenium入门7 内嵌框架iframe

    如果网页内嵌iframe,那么iframe里的元素是无法直接定位的,需要使用switch_to.frame进入frame操作: 之后需要再操作页面上非嵌入在iframe里的元素,需要使用switch_ ...

  10. IOS Post请求(请求服务器)

    @interface HMViewController () @property (weak, nonatomic) IBOutlet UITextField *usernameField; @pro ...