Image类封装之生成缩略图

<?php
/**
 * GDBasic.php
 * author: F.X
 * date: 2017
 * description GD基础类
 */

namespace Imooc\Lib;


class GDBasic
{
    protected static $_check =false;

    //检查服务器环境中gd库
    public static function check()
    {
        //当静态变量不为false
        if(static::$_check)
        {
            return true;
        }

        //检查gd库是否加载
        if(!function_exists("gd_info"))
        {
            throw new \Exception('GD is not exists');
        }

        //检查gd库版本
        $version = '';
        $info = gd_info();
        if(preg_match("/\\d+\\.\\d+(?:\\.\\d+)?/", $info["GD Version"], $matches))
        {
            $version = $matches[0];
        }

        //当gd库版本小于2.0.1
        if(!version_compare($version,'2.0.1','>='))
        {
            throw new \Exception("GD requires GD version '2.0.1' or greater, you have " . $version);
        }

        self::$_check = true;
        return self::$_check;
    }
}

GDBasic.php

 

 

Image.php

<?php
/*
 * @Description: 图像类
 * @Author: your name
 * @Date: 2019-07-02 09:19:45
 * @LastEditTime: 2019-07-02 10:13:06
 * @LastEditors: Please set LastEditors
 */

namespace Imooc\Lib;
require_once 'GDBasic.php';

class Image extends GDBasic
{
    protected $_width;
    protected $_height;
    protected $_type;
    protected $_im;
    protected $_mime;
    protected $_real_path;

    public function __construct($file)
    {
        //检查GD库
        self::check();
        $imageInfo = $this->createImageByFile($file);
        $this->_width = $imageInfo['width'];
        $this->_height = $imageInfo['height'];
        $this->_type = $imageInfo['type'];
        $this->_im = $imageInfo['im'];
        $this->_mime = $imageInfo['mime'];
        $this->_real_path = $imageInfo['real_path'];


    }



    /**
     * @根据文件创建图像: 
     * @param $file
     * @return array
     * @throws \Exception
     */
    public function createImageByFile($file)
    {
        //检查文件是否存在
        if(!file_exists($file))
        {
            throw new \Exception('file is not exists');
        }
        //获取图像信息
        $imageInfo = getimagesize($file);
        $realpath = realpath($file);
        if(!$imageInfo)
        {
            throw new \Exception('file is not image file');
        }

        switch($imageInfo[2])
        {
            case IMAGETYPE_GIF:
                $im = imagecreatefromgif($file);
                break;
            case IMAGETYPE_JPEG:
                $im = imagecreatefromjpeg($file);
                break;
            case IMAGETYPE_PNG:
                $im = imagecreatefrompng($file);
                break;
            default:
                throw new \Exception('image file is not gif,png,jpeg');
        }

        return array(
            'width'=>$imageInfo[0],
            'height'=>$imageInfo[1],
            'type'=>$imageInfo[2],
            'mime'=>$imageInfo['mime'],
            'im'=>$im,
            'real_path'=>$realpath
        );


    }


    /**
     * @缩略图: 
     * @param int $width 缩略图宽度
     * @param int $height 缩略图高度 
     * @return: $this
     * @throws \Exception
     */
    public function resize($width,$height)
    {
        if(!is_numeric($width) || !is_numeric($height))
        {
            throw new \Exception('width and height is not number');
        }

        //根据传参的宽高获取最终的宽高
        $srcW = $this->_width;
        $srcH = $this->_height;

        if($width<=0 ||$height<=0)
        {
            $desW = $srcW;
            $desH = $srcH;            
        }
        else
        {
            $srcP = $srcW/$srcH;
            $desP = $width/$height;

            if($width > $srcW)
            {
                if($height > $srcH)
                {
                    $desW = $srcW;
                    $desH = $srcH;
                }
                else
                {
                    $desH = $height;
                    $desW = round($desH * $srcp);
                }
            }
            else
            {
                if($desP > $srcP)
                {
                    $desW = $width;
                    $desH = round($desW/$srcP);                    
                }
                else
                {
                    $desH = $height;
                    $desw = round($desH * $srcP);
                }
            }

        }


        //检测php版本是否小于php5.5
        if(version_compare(PHP_VERSION,'5.5.0','<'))
        {
            $desIm = imagecreatetruecolor($desW,$desH);
            if(imagecopyresampled($desIm,$this->_im,0,0,0,0,$desW,$desH,$srcW,$srcH))
            {
                imagedestory($this->_im);
                $this->_im = $desIm;
                $this->_width = imagesx($this->_im);
                $this->_height = imagesy($this->_im);
                
            }
        }
        else
        {
            if($desIm = imagescale($this->_im,$desW,$desH))
            {
                $this->_im = $desIm;
                $this->_width = imagesx($this->_im);
                $this->_height = imagesy($this->_im);
            }
        }
        return $this;

    }


    /**
     * @图像输出: 
     * @param {type} 
     * @return: bool
     */
    public function show()
    {
        header('Content-Type:'.$this->_mime);
        if($this->_type == 1)
        {
            imagegif($this->_im);
            return true;
        }
        if($this->_type ==2)
        {
            imagejpeg($this->_im);
            return true;
        }
        if($this->_type == 3)
        {
            imagepng($this->_im);
            return true;
        }
    }
}



?>

show.php

 

<?php
require_once './lib/Image.php';
$image = new \Imooc\Lib\Image('./images/b.png');
$image->resize(200,100)->show();





?>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CDimage 是一款镜像制作工具,出自微软。它是微软内部“专用的”ISO 封装工具,不向外提供;所以,我们平时所看到的、使用的都是从微软内部泄露出来的~!!CDimage是系统整合不可少的利器,大大节省了光盘存放空间;我们平时见的"N合1”光盘大都是由CDimage(或内置CDimage内核的光盘工具,如Easyboot等)创建的。 但是我想网友们最关心的或许并不是以上问题,而是“CDimage到底能不能封装出SHA1值和官方一致的ISO镜像?”。下面我们就来说说CDimage的用法--其实你英文好的话用help命令查看即可!以下是常用参数[2.47版]的中文说明: -l 卷标,无空格(例如:-lMYLABEL) -t 所有目录和文件的时间标记,无空格,任意分隔符(例如:-t12/31/2000,15:01:00) -g 把文件时间从本地时间转换为GMT时间 -h 包含隐藏的文件和目录 -n 允许长文件名(比DOS的8.3文件名长) -nt 允许长文件名,与NT3.51兼容(-nt与-d不能同时使用) -d 不强制转换文件名的小写字母为大写字母 -c 使用ANSI文件名,不用源OEM文件名 -b "El Torito"光盘启动文件,无空格(例如:-bc:\location\cdboot.bin) -p "El Torito"启动目录的平台ID -e 在El Torito启动目录中不要设置软盘模拟方式 -s 在镜像文件中签上数字签名(无空格,给出RPC服务器名和结束点名称,像这样-sServerName:EndPointName) -x 在镜像中计算并制作"AutoCRC"值 -o 优化容量:重复的文件只制作一次 -y 试验选项,跟一个数字(例如:-y1),为试验的目的而产生ISO-9660的非标准变化: 1 在文件名后续加版本号';1'(7.5.1) 2 圆整目录大小为2K的倍数(6.8.1.3) 5 先写\i386目录,逆序 6 允许目录记录正好排到扇区结束点(符合ISO-96606.8.1.1但是突破了MSCDEX) 7 产生NT4.0下的16位应用程序时报警 -oc 更慢的重复文件探测方式:二进制比较而不是MD5哈西值 -oi 比较文件时忽略diamond压时间标记 -os 建立镜像时显示重复的文件(-o选项可以组合,像这样:-ocis) -k (keep)即使某些源文件打开失败也生成镜像 -m 忽略镜像文件最大681,984,000bytes的限制 -a 《分配概要》显示文件和目录的大小 -q 只扫描源文件,不建立镜像文件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值