1.图片处理类.imagecls.php
<?php
/**
图片处理类
*/
class imagecls
{
/**
* 文件信息
*/
var $file = array();
/**
* 保存目录
*/
var $dir = '';
/**
* 错误代码
*/
var $error_code = 0;
/**
* 文件上传最大KB
*/
var $max_size = -1;
function es_imagecls()
{
}
private function checkSize($size)
{
return !($size > $this->max_size) || (-1 == $this->max_size);
}
/**
* 处理上传文件
* @param array $file 上传的文件
* @param string $dir 保存的目录
* @return bool
*/
function init($file, $dir = 'temp')
{
if(!is_array($file) || empty($file)
|| !$this->isUploadFile($file['tmp_name']) || trim($file['name']) == '' || $file['size'] == 0)
{
$this->file = array();
$this->error_code = -1;
return false;
}
else
{
$file['size'] = intval($file['size']);
$file['name'] = trim($file['name']);
$file['thumb'] = '';
$file['ext'] = $this->fileExt($file['name']);
$file['name'] = htmlspecialchars($file['name'], ENT_QUOTES);
$file['is_image'] = $this->isImageExt($file['ext']);
$file['file_dir'] = $this->getTargetDir($dir);
$file['prefix'] = md5(microtime(true)).rand(10,99);
$file['target'] = "./public/".$file['file_dir'].'/'.$file['prefix'].'.jpg'; //相对
$file['local_target'] = APP_ROOT_PATH."public/".$file['file_dir'].'/'.$file['prefix'].'.jpg';//物理
$this->file = &$file;
$this->error_code = 0;
return true;
}
}
/**
* 保存文件
* @return bool
*/
function save()
{
if(empty($this->file) || empty($this->file['tmp_name']))
$this->error_code = -101;
elseif(!$this->checkSize($this->file['size']))
$this->error_code = -105;
elseif(!$this->file['is_image'])
$this->error_code = -102;
elseif(!$this->saveFile($this->file['tmp_name'], $this->file['local_target']))
$this->error_code = -103;
elseif($this->file['is_image'] &&
(!$this->file['image_info'] = $this->getImageInfo($this->file['local_target'], true)))
{
$this->error_code = -104;
@unlink($this->file['local_target']);
}
else
{
$this->error_code = 0;
return true;
}
return false;
}
/**
* 获取错误代码
* @return number
*/
function error()
{
return $this->error_code;
}
/**
* 获取文件扩展名
* @return string
*/
function fileExt($file_name)
{
return addslashes(strtolower(substr(strrchr($file_name, '.'), 1, 10)));
}
/**
* 根据扩展名判断文件是否为图像
* @param string $ext 扩展名
* @return bool
*/
function isImageExt($ext)
{
static $img_ext = array('jpg', 'jpeg', 'png', 'bmp','gif','giff');
return in_array($ext, $img_ext) ? 1 : 0;
}
/**
* 获取图像信息
* @param string $target 文件路径
* @return mixed
*/
function getImageInfo($target)
{
$ext = es_imagecls::fileExt($target);
$is_image = es_imagecls::isImageExt($ext);
if(!$is_image)
return false;
elseif(!is_readable($target))
return false;
elseif($image_info = @getimagesize($target))
{
list($width, $height, $type) = !empty($image_info) ? $image_info :
array('', '', '');
$size = $width * $height;
if($is_image && !in_array($type, array(1,2,3,6,13)))
return false;
$image_info['type'] =
strtolower (substr(image_type_to_extension($image_info[2]),1));
return $image_info;
}
else
return false;
}
/**
* 获取是否充许上传文件
* @param string $source 文件路径
* @return bool
*/
function isUploadFile($source)
{
return $source && ($source != 'none') &&
(is_uploaded_file($source) || is_uploaded_file(str_replace('', '', $source)));
}
/**
* 获取保存的路径
* @param string $dir 指定的保存目录
* @return string
*/
function getTargetDir($dir)
{
if (!is_dir(APP_ROOT_PATH."public/".$dir)) {
@mkdir(APP_ROOT_PATH."public/".$dir);
@chmod(APP_ROOT_PATH."public/".$dir, 0777);
}
return $dir;
}
/**
* 保存文件
* @param string $source 源文件路径
* @param string $target 目录文件路径
* @return bool
*/
private function saveFile($source, $target)
{
if(!es_imagecls::isUploadFile($source))
$succeed = false;
elseif(@copy($source, $target))
$succeed = true;
elseif(function_exists('move_uploaded_file') &&
@move_uploaded_file($source, $target))
$succeed = true;
elseif (@is_readable($source) &&
(@$fp_s = fopen($source, 'rb')) && (@$fp_t = fopen($target, 'wb')))
{
while (!feof($fp_s))
{
$s = @fread($fp_s, 1024 * 512);
@fwrite($fp_t, $s);
}
fclose($fp_s);
fclose($fp_t);
$succeed = true;
}
if($succeed)
{
$this->error_code = 0;
@chmod($target, 0644);
@unlink($source);
}
else
{
$this->error_code = 0;
}
return $succeed;
}
public function thumb($image,$maxWidth=200,$maxHeight=50,$gen = 0,
$interlace=true,$filepath = '',$is_preview = true)
{
$info = es_imagecls::getImageInfo($image);
if($info !== false)
{
$srcWidth = $info[0];
$srcHeight = $info[1];
$type = $info['type'];
$interlace = $interlace? 1:0;
unset($info);
if($maxWidth > 0 && $maxHeight > 0)
$scale = min($maxWidth/$srcWidth, $maxHeight/$srcHeight);
// 计算缩放比例
elseif($maxWidth == 0)
$scale = $maxHeight/$srcHeight;
elseif($maxHeight == 0)
$scale = $maxWidth/$srcWidth;
$paths = pathinfo($image);
$paths['filename'] = trim(strtolower($paths['basename']),
".".strtolower($paths['extension']));
$basefilename = explode("_",$paths['filename']);
$basefilename = $basefilename[0];
if(empty($filepath))
{
if($is_preview)
$thumbname = $paths['dirname'].'/'.$basefilename.
'_'.$maxWidth.'x'.$maxHeight.'.jpg';
else
$thumbname = $paths['dirname'].'/'.$basefilename.
'o_'.$maxWidth.'x'.$maxHeight.'.jpg';
}
else
$thumbname = $filepath;
$thumburl = str_replace(APP_ROOT_PATH,'./',$thumbname);
if($scale >= 1)
{
// 超过原图大小不再缩略
$width = $srcWidth;
$height = $srcHeight;
if(!$is_preview)
{
//非预览模式写入原图
file_put_contents($thumbname,file_get_contents($image)); //用原图写入
return array('url'=>$thumburl,'path'=>$thumbname);
}
}
else
{
// 缩略图尺寸
$width = (int)($srcWidth*$scale);
$height = (int)($srcHeight*$scale);
}
if($gen == 1)
{
$width = $maxWidth;
$height = $maxHeight;
}
// 载入原图
$createFun = 'imagecreatefrom'.($type=='jpg'?'jpeg':$type);
if(!function_exists($createFun))
$createFun = 'imagecreatefromjpeg';
$srcImg = $createFun($image);
//创建缩略图
if($type!='gif' && function_exists('imagecreatetruecolor'))
$thumbImg = imagecreatetruecolor($width, $height);
else
$thumbImg = imagecreate($width, $height);
$x = 0;
$y = 0;
if($gen == 1 && $maxWidth > 0 && $maxHeight > 0)
{
$resize_ratio = $maxWidth/$maxHe