<?php
# MetInfo Enterprise Content Management System 
# Copyright (C) MetInfo Co.,Ltd (http://www.metinfo.cn). All rights reserved. 

defined('IN_MET') or exit('No permission');

load::sys_func('file.func.php');

/** 
 * 缩略图类
 * @param string $thumb_width 	缩略图宽
 * @param string $thumb_height 	缩略图高
 * @param string $thumb_savepath	缩略图保存地址
 * @param string $thumb_save_type	保存方式，1:保存在原图路径的子目录下，2:覆盖原图片，3:自定义路径
 * @param string $thumb_bgcolor		缩略图背景颜色，已#开头
 * @param string $thumb_kind		生成缩略图方式，1拉升，2留白，3裁剪
 * 以上路径变量都必须是绝对路径，如果不使用类的set方法
 */
class thumb {
	public $thumb_src_image = ""; 
	public $thumb_width = 350;
	public $thumb_height = 350; 
	public $thumb_savepath = ""; 
	public $thumb_save_type = 1; 
	public $thumb_bgcolor =' ';
	public $thumb_kind = 1;
	
	function __construct() {
		global $_M;
		$this->list_news();
	}
	
	/** 
	 * 设置字段
	 * @param string $name  需要设置的字段名，为public字段都可以设置
	 * @param string $value 需要设置的字段名的值	 
	 * thumb_savepath当thumb_save_type为3时置可以是绝对路径，也是相对网站后台根目录的相对路径
	 * thumb_savepath当thumb_save_type为2，设置无效
	 * thumb_savepath当thumb_save_type为1，thumb_savepath为相对原图的路径
	 */
	public function set($name, $value) {
		global $_M;
		if ($value === NULL) {
			return false;
		}
		switch ($name) {
			case 'thumb_width';
				$this->thumb_width =  $value;
			break;
			case 'thumb_height';
				$this->thumb_height = $value;
			break;
			case 'thumb_savepath';
				if ($this->thumb_save_type == 3) {
					$this->thumb_savepath = path_absolute($value);
				} else {
					$this->thumb_savepath = $value;
				}
				$this->thumb_savepath = path_standard($this->thumb_savepath);
			break;
			case 'thumb_save_type';
				$this->thumb_save_type = $value;
			break;
			case 'thumb_bgcolor';
				$this->thumb_bgcolor = $value;
			break;
			case 'thumb_kind';
				$this->thumb_kind = $value;
			break;
		}	
	}
	
	/** 
	 * 按网站列表页缩略图方式缩略图片（2 = 新闻模块, 3 = 产品模块, 5 = 图片模块）
	 * @param string $module  2/news:新闻模块，3/product:产品模块，5/img:图片模块）
	 */
	public function list_module($module) {
		if ($module == 'news') $module = 2;
		if ($module == 'product') $module = 3;
		if ($module == 'img') $module = 5;
		switch ($module) {
			case 2:
				$this->list_news();
			break;
			case 3:
				$this->list_product();
			break;
			case 5:
				$this->list_img();
			break;		
		}
	}
	
	/** 
	 * 按网站内容页缩略图方式缩略图片（3 = 产品模块, 5 = 图片模块）
	 * @param string $module 3/product:产品模块，5/img:图片模块）
	 */
	public function content_module($module) {
		if ($module == 'product') $module = 3;
		if ($module == 'img') $module = 5;
		switch ($module) {
			case 3;
				$this->contents_product();
			break;
			case 5;
				$this->contents_img();
			break;		
		}
	}
	
	/** 
	 * 按网站新闻列表页缩略图方式缩略图片
	 */
	public function list_news() {
		global $_M;
		$this->set('thumb_width', $_M['config']['met_newsimg_x']);
		$this->set('thumb_height', $_M['config']['met_newsimg_y']);
		$this->set('thumb_save_type', 1);
		$this->set('thumb_savepath', 'thumb/');
		$this->set('thumb_kind', $_M['config']['met_thumb_kind']);
		$this->set('thumb_bgcolor', '#FFFFFF');
	}
	
	/** 
	 * 按网站产品列表页缩略图方式缩略图片
	 */
	public function list_product() {
		global $_M;
		$this->set('thumb_width', $_M['config']['met_productimg_x']);
		$this->set('thumb_height', $_M['config']['met_productimg_y']);
		$this->set('thumb_save_type', 1);
		$this->set('thumb_savepath', 'thumb/');
		$this->set('thumb_kind', $_M['config']['met_thumb_kind']);
		$this->set('thumb_bgcolor', '#FFFFFF');
	}
	
	/** 
	 * 按网站图片列表页缩略图方式缩略图片
	 */
	public function list_img() {
		global $_M;
		$this->set('thumb_width', $_M['config']['met_imgs_x']);
		$this->set('thumb_height', $_M['config']['met_imgs_y']);
		$this->set('thumb_save_type', 1);	
		$this->set('thumb_savepath', 'thumb/');
		$this->set('thumb_kind', $_M['config']['met_thumb_kind']);
		$this->set('thumb_bgcolor', '#FFFFFF');
	}
	
	/** 
	 * 按网站图片内容页缩略图方式缩略图片
	 */
	public function contents_img() {
		global $_M;
		$this->set('thumb_width', $_M['config']['met_imgdetail_x']);
		$this->set('thumb_height', $_M['config']['met_imgdetail_y']);
		$this->set('thumb_save_type', 1);	
		$this->set('thumb_savepath', 'thumb_dis/');
		$this->set('thumb_kind', $_M['config']['met_thumb_kind']);
		$this->set('thumb_bgcolor', '#FFFFFF');
	}
	
	/** 
	 * 按网站产品内容页缩略图方式缩略图片
	 */
	public function contents_product() {
		global $_M;
		$this->set('thumb_width', $_M['config']['met_productdetail_x']);
		$this->set('thumb_height', $_M['config']['met_productdetail_y']);
		$this->set('thumb_kind', $_M['config']['met_thumb_kind']);
		$this->set('thumb_save_type', 1);
		$this->set('thumb_savepath', 'thumb_dis/');
		$this->set('thumb_bgcolor', '#FFFFFF');
	}
	
    /**
	 * 生成缩略图的方法
	 * @param  strint	原图地址       
	 * @return array	返回成功或错误信息
	 * 返回值为数组各字段含义，error:是否出错，1出错，0正常，errorcode:报错代码，path:缩略图片路径
     */
    public function createthumb($thumb_src_image) {
		global $_M;
		$thumb_src_image = path_absolute($thumb_src_image);		
		if ($this->thumb_save_type == 1) {		
			$thumb_savepath = dirname($thumb_src_image).'/'.$this->thumb_savepath;
		}
		if ($this->thumb_save_type == 2) {
			$thumb_savepath = dirname($thumb_src_image).'/';			
		}
		if ($this->thumb_save_type == 3) {
			$thumb_savepath = $this->thumb_savepath;
		}
		if (stristr(PHP_OS,"WIN")) {
			$thumb_src_image = @iconv("utf-8","GBK",$thumb_src_image);
		}
		if(!file_exists($thumb_src_image) || is_dir($thumb_src_image)){
			return $this->error($_M['word']['batchtips30']);
		}
		
		$this->thumb_width=$this->thumb_width?$this->thumb_width:100;
		$this->thumb_height=$this->thumb_height?$this->thumb_height:100;
		$gd = $this->gd_version(); 

        //检查原始是否文件存在并且得到原图信息
        $org_info = @getimagesize($thumb_src_image);//返回图片大小
        if ($org_info[mime]=='image/bmp') {//bmp图无法压缩   
		   return $this->error($_M['word']['upfileFail5']);
        }
        if (!$this->check_img_function($org_info[2])) {
		   return $this->error($_M['word']['upfileFail6']);
        }

        $img_org = $this->img_resource($thumb_src_image, $org_info[2]);

        //原始图像和缩略图尺寸对比
        $scale_org      = $org_info[0] / $org_info[1];
		$scale_tumnb    = $this->thumb_width / $this->thumb_height;
		
        //处理缩略图宽度和高度为0的情况，背景和缩略图一样大
        if ($this->thumb_width == 0) {
            $this->thumb_width = $this->thumb_height * $scale_org;
        }
        if ($this->thumb_height == 0) {
            $this->thumb_height = $this->thumb_width / $scale_org;
        }

        //创建缩略图
        if ($gd == 2) {//创建一张缩略图（黑色）
            $img_thumb  = imagecreatetruecolor($this->thumb_width, $this->thumb_height);
        } else {
            $img_thumb  = imagecreate($this->thumb_width, $this->thumb_height);
        }

        //缩略图背景颜色
        if (empty($this->thumb_bgcolor)) $this->thumb_bgcolor = "#FFFFFF";
        $this->thumb_bgcolor = trim($this->thumb_bgcolor, "#");
        sscanf($this->thumb_bgcolor, "%2x%2x%2x", $red, $green, $blue);
        $clr = imagecolorallocate($img_thumb, $red, $green, $blue);
        imagefilledrectangle($img_thumb, 0, 0, $this->thumb_width, $this->thumb_height, $clr);//创建背景色，默认为白色
		switch ($this->thumb_kind) {
			case 1:
				$dst_x=0;
				$dst_y=0;
				$lessen_width=$this->thumb_width;
				$lessen_height=$this->thumb_height;
				$scr_x=0;
				$scr_y=0;
				$scr_w=$org_info[0];
				$scr_h=$org_info[1];
			break;
			case 2:
			  if ($org_info[0] / $this->thumb_width > $org_info[1] / $this->thumb_height){//上下留白
					$lessen_width  = $this->thumb_width;
					$lessen_height  = $this->thumb_width / $scale_org;
				}
				else{//左右留白
					$lessen_width  = $this->thumb_height * $scale_org;
					$lessen_height = $this->thumb_height;
				}
				$dst_x = ($this->thumb_width  - $lessen_width)  / 2;
				$dst_y = ($this->thumb_height - $lessen_height) / 2;
				$scr_x=0;
				$scr_y=0;
				$scr_w=$org_info[0];
				$scr_h=$org_info[1];
			break;
			case 3:
				$dst_x=0;
				$dst_y=0;
				$lessen_width=$this->thumb_width;
				$lessen_height=$this->thumb_height;
				if ($org_info[0] / $this->thumb_width > $org_info[1] / $this->thumb_height) {//上下留白,截左右
					$scr_w  = $org_info[1] * $scale_tumnb;
					$scr_h = $org_info[1];
				} else {//左右留白,截上下
					$scr_w  = $org_info[0];
					$scr_h  = $org_info[0] / $scale_tumnb;
				}
				$scr_x = ($org_info[0]  - $scr_w)  / 2;
				$scr_y = ($org_info[1] - $scr_h) / 2;
			break;			
		}
       //放大原始图片
        if ($gd == 2) {
            imagecopyresampled($img_thumb, $img_org, $dst_x, $dst_y, $scr_x, $scr_y, $lessen_width, $lessen_height, $scr_w, $scr_h);
        } else {
            imagecopyresized($img_thumb, $img_org, $dst_x, $dst_y, $scr_x, $scr_y, $lessen_width, $lessen_height, $scr_w, $scr_h);
        }
        if (!makedir($thumb_savepath)) {
			return $this->error($_M['word']['upfileFail4']);
        }
	
        $thumbname = $thumb_savepath.basename($thumb_src_image);;
        //Create
		switch ($org_info[mime]) {
            case 'image/gif':
				if (function_exists('imagegif')) {
					$re=imagegif($img_thumb, $thumbname);
				} else {
					return $this->error($_M['word']['upfileFail9']);
				}
                break;
            case 'image/pjpeg':
            case 'image/jpeg':
				if (function_exists('imagejpeg')) {
					$re=imagejpeg($img_thumb, $thumbname,100);
				} else {
					return $this->error($_M['word']['upfileFail10']);
				}
                break;
            case 'image/x-png':
            case 'image/png':
				if (function_exists('imagejpeg')) {
					$re=imagepng($img_thumb, $thumbname);
				} else {
					return $this->error($_M['word']['upfileFail11']);
				}
                break;
            default:
               return $this->error($_M['word']['upfileFail7']);
        }
		if (!$re) {
			return $this->error($_M['word']['upfileFail8']);
		}
		if (stristr(PHP_OS,"WIN")) {
			$thumbname = @iconv("GBK","utf-8",$thumbname);
		}
		$thumbname='../'.str_replace(PATH_WEB, '', $thumbname);
        imagedestroy($img_thumb);
        imagedestroy($img_org);
        return $this->sucess($thumbname);
    }

	/**
	 * 创建图片资源
	 * @param string $img:	     创建图片的路径
	 * @param string $mime_type: 图片类型
	 * @return                   返回创建的图片资源
	 */
    protected function img_resource($img, $mime_type) {
        switch ($mime_type) {
            case 1:
            case 'image/gif':
                $res = imagecreatefromgif($img);
                break;

            case 2:
            case 'image/pjpeg':
            case 'image/jpeg':
                $res = imagecreatefromjpeg($img);
                break;

            case 3:
            case 'image/x-png':
            case 'image/png':
                $res = imagecreatefrompng($img);
                break;

            default:
                return false;
        }
        return $res;
    }	
	
	/**
	 * 得到的Gd服务器版本
	 * @return int 返回Gd服务器版本
     */
    protected function gd_version() {
        static $version = -1;
        if ($version >= 0) {
            return $version;
        }
        if (!extension_loaded('gd')) {
            $version = 0;
        } else {
            // 使用 gd_info() 函数取得当前安装的 GD 库的信息
            if (PHP_VERSION >= '4.3') {
                if (function_exists('gd_info')) {
                    $ver_info = gd_info();
                    preg_match('/\d/', $ver_info['GD Version'], $match);
                    $version = $match[0];
                } else {
                    if (function_exists('imagecreatetruecolor')) {
                        $version = 2;
                    } else if (function_exists('imagecreate')) {
                        $version = 1;
                    }
                }
            }else{
                if (preg_match('/phpinfo/', ini_get('disable_functions'))) {     
                    $version = 1;
                } else {
                  // 使用 phpinfo() 函数
                   ob_start();
                   phpinfo(8);
                   $info = ob_get_contents();
                   ob_end_clean();
                   $info = stristr($info, 'gd version');
                   preg_match('/\d/', $info, $match);
                   $version = $match[0];
                }
            }
        }
        return $version;
    }
	
    /**
	 * 检测PHP版本以及处理函数是否可用
	 * @return buttton 返回可用或不可用信息
     */
    protected function check_img_function($img) {
        switch ($img){
            case 'image/gif':
            case 1:
                if (PHP_VERSION >= '4.3') {
                    return function_exists('imagecreatefromgif');
                } else {
                    return (imagetypes() & IMG_GIF) > 0;
                }
            break;

            case 'image/pjpeg':
            case 'image/jpeg':
            case 2:
                if (PHP_VERSION >= '4.3') {
                    return function_exists('imagecreatefromjpeg');
                } else {
                    return (imagetypes() & IMG_JPG) > 0;
                }
            break;

            case 'image/x-png':
            case 'image/png':
            case 3:
                if (PHP_VERSION >= '4.3') {
                     return function_exists('imagecreatefrompng');
                } else {
                    return (imagetypes() & IMG_PNG) > 0;
                }
            break;
			
            default:
                return false;
        }
    }
	
	/**
	 * 缩略图错误调用方法		
	 * @param string $error 错误信息
	 * @return array 返回错误信息
	 */
	protected function error($error) {
		$back['error'] = 1;
		$back['errorcode'] = $error;
		return $back;
	}
	
	/**
	 * 缩略图成功调用方法
	 * @param string $path 路径
	 * @return array 返回成功路径(相对于当前路径)
	 */
	protected function sucess($path) {
		$back['error']=0;
		$back['path']=$path;
		return $back;
	}
}
# This program is an open source system, commercial use, please consciously to purchase commercial license.
# Copyright (C) MetInfo Co., Ltd. (http://www.metinfo.cn). All rights reserved.
?>