<?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. 单元测试模拟request后台

    编写测试单元 @RunWith(SpringJUnit4ClassRunner.class) 让测试运行于Spring测试环境 @WebAppConfiguration是一个类级别的注释,用于声明Ap ...

  2. PHP中函数的定义与使用

    函数是什么? 函数是一个被命名的.独立的代码段,它执行特定的任务,并可能给调用它的程序返回一个值. 函数是被命名的,每个函数都有唯一的名称. 函数是独立的,无需程序其他部分干预,函数便能执行自己的任务 ...

  3. JavaScript流程控制语句脑图

    JavaScript流程控制语句脑图 图片是从网上找来的,在这记录一下,以备后面需要的时候查找方便. JavaScript通过规定的语句让有条件的按照一定的方式执行. 分为:循环语句 while do ...

  4. 在Centos7中安装Docker并实例化Mysql

    首先 本文是一篇安装流程,从初始的Centos7安装Docker后实例化一个Mysql的整个流程,其中会包含一些需要注意的疑点和坑. 实例化的Mysql是将数据和配置保存在宿主机. 注意,在安装Doc ...

  5. Struts2_Action和Result总结

    Action 1.实现一个Actiond的最常用方式:从ActionSupport继承2.DMI动态方法调用3.通配符配置 *{1}{2}... a) *_*4.接收参数的方法(一般用属性或者Doma ...

  6. Js arguments.callee();函数自己调用自己

    1.阶乘的时候,函数一般要用到递归算法,所以函数内部一定会调用自身 //递归,阶乘 function sum(num){ ) { ; } else{ ); //自己调用自己,递归 } } alert( ...

  7. Selenium入门系列1 打开浏览器访问网页,退出浏览器

    对于功能自动化的理解就是用测试工具替代手工.手工怎么操作的,工具也如何操作. 手工测试:在前置条件下,执行一定的操作步骤>与预期结果对比 功能自动化:在前置条件下,识别对象 >操作对象&g ...

  8. telegram汉化和代理

    telegram在Ubuntu18.04的应用商店中可以一键下载. 1.注册:用国内手机号即可,就是验证码可能很慢. 2.汉化:关注zh-CN 频道,在点击其中的安装链接即可. 3.代理: 如果你使用 ...

  9. 的NodeJS异步数据库函数需要同步的答案 +

    我是新来的NodeJS和我写,需要从我去过的所有的函数应该是在这种情况下,读QUERY我的MySQL数据库,并返回代码,我非常希望服务器能够对其他事件作出回应而这个地方是轨迹查询请求.然而,它并不特别 ...

  10. 某寺庙,有小和尚、老和尚若干。有一水缸,由小和尚用水桶从井中提水入缸,老和尚用水桶从缸里取水饮用。水缸可容10桶水,水取自同一井中。水井径窄,每次只能容一个水桶取水。水桶总数为3个。每次入、取缸水仅为1桶,且不可以同时进行。试用P、V操作给出小和尚、老和尚动作的算法描述。

    寺庙和尚打水 设信号量mutex_gang, mutex_jing, gang_empty, gang_full, count分别表示使用缸互斥, 使用井互斥, 缸空, 缸满, 水桶总个数 semap ...