PHP生成缩略图类

  • 支持加载图片文件和加载图片字符串
  • 可以将缩略图输出到浏览器和保持缩略图文件
  • 支持gif,png,jpeg类型的缩略
  • 可以设定是否按比例来拉伸
<?php
/**
 * 生成缩略图(支持加载图片文件和字符串2种方式)
 * @param       $maxWidth       缩略图最大宽度
 * @param       $maxHeight      缩略图最大高度
 * @param       bool    $scale  是否按比例缩小,否则拉伸
 * @param       bool    $inflate        是否放大以来填充缩略图          
 */
class Thumbnail {

        private $maxWidth;
        private $maxHeight;
        private $scale;
        private $inflate;
        private $types;
        private $imgLoaders;
        private $imgCreators;
        private $source;
        private $sourceWidth;
        private $sourceHeight;
        private $sourceMime;
        private $thumb;
        private $thumbWidth;
        private $thumbHeight;

        public function __construct($maxWidth, $maxHeight, $scale = true, $inflate = true) {
                $this->maxWidth = $maxWidth;
                $this->maxHeight = $maxHeight;
                $this->scale = $scale;
                $this->inflate = $inflate;
                $this->types = array(
                    'image/jpeg',
                    'image/png',
                    'image/gif'
                );
                //加载MIME类型图像的函数名称
                $this->imgLoaders = array(
                    'image/jpeg'        =>      'imagecreatefromjpeg',
                    'image/png'         =>      'imagecreatefrompng',
                    'image/gif'         =>      'imagecreatefromgif'
                );
                //储存创建MIME类型图片的函数名称
                $this->imgCreators = array(
                    'image/jpeg'        =>      'imagejpeg',
                    'image/png'         =>      'imagepng',
                    'image/gif'         =>      'imagegif'
                );           
        }
        /**
         * 文件方式加载图片
         * @param       string  $image 源图片
         * @return      bool    
         */
        public function loadFile($image){
                if(!$dims = @getimagesize($image)){
                        trigger_error("源图片不存在");
                }
                if(in_array($dims['mime'], $this->types)){
                        $loader = $this->imgLoaders[$dims['mime']];
                        $this->source = $loader($image);
                        $this->sourceWidth = $dims[0];
                        $this->sourceHeight = $dims[1];
                        $this->sourceMime = $dims['mime'];
                        $this->initThumb();
                        return TRUE;
                }else{
                        trigger_error('不支持'.$dims['mime']."图片类型");
                }
        }
        /**
         * 字符串方式加载图片
         * @param       string $image  字符串
         * @param       string $mime    图片类型
         * @return type 
         */
        public function loadData($image,$mime){
                if(in_array($mime, $this->types)){
                        if($this->source = @imagecreatefromstring($image)){
                                $this->sourceWidth = imagesx($this->source);
                                $this->sourceHeight = imagesy($this->source);
                                $this->sourceMime = $mime;
                                $this->initThumb();
                                return TRUE;
                        }else{
                                trigger_error("不能从字符串加载图片");
                        }
                }else{
                        trigger_error("不支持".$mime."图片格式");
                }
        }
        /**
         * 生成缩略图
         * @param       string  $file   文件名。如果不为空则储存为文件,否则直接输出到浏览器
         */
        public function buildThumb($file = null){
                $creator = $this->imgCreators[$this->sourceMime];
                if(isset($file)){
                        return $creator($this->thumb,$file);
                }else{
                        return $creator($this->thumb);
                }
        }
        /**
         * 处理缩放
         */
        public function initThumb(){
                if($this->scale){
                        if($this->sourceWidth > $this->sourceHeight){
                                $this->thumbWidth = $this->maxWidth;
                                $this->thumbHeight = floor($this->sourceHeight*($this->maxWidth/$this->sourceWidth));
                        }elseif($this->sourceWidth < $this->sourceHeight){
                                $this->thumbHeight = $this->maxHeight;
                                $this->thumbWidth = floor($this->sourceWidth*($this->maxHeight/$this->sourceHeight));
                        }else{
                                $this->thumbWidth = $this->maxWidth;
                                $this->thumbHeight = $this->maxHeight;
                        }
                }
                $this->thumb = imagecreatetruecolor($this->thumbWidth, $this->thumbHeight);
                
                if($this->sourceWidth <= $this->maxWidth && $this->sourceHeight <= $this->maxHeight && $this->inflate == FALSE){
                        $this->thumb = $this->source;
                }else{
                        imagecopyresampled($this->thumb, $this->source, 0, 0, 0, 0, $this->thumbWidth, $this->thumbHeight, $this->sourceWidth, $this->sourceHeight);
                }
        }
        
        public function getMine(){
                return $this->sourceMime;
        }
        
        public function getThumbWidth(){
                return $this->thumbWidth;
        }
        
        public function getThumbHeight(){
                return $this->thumbHeight;
        }

}

/**
 * 缩略图类调用示例(文件)
 */
$thumb = new Thumbnail(200, 200);
$thumb->loadFile('wap.gif');
header('Content-Type:'.$thumb->getMine());
$thumb->buildThumb();
/**
 * 缩略图类调用示例(字符串)
 */
$thumb = new Thumbnail(200, 200);
$image = file_get_contents('wap.gif');
$thumb->loadData($image, 'image/jpeg');
$thumb->buildThumb('wap_thumb.gif');


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值