class ThumbImages{
/**
* 生成缩略图
* prorate 按比例缩放
* distortion 扭曲型缩图
* cut 最小裁剪后的缩图
* backFill 背景填充图
* clssname ThumbImages
* createtime:2014-1-14下午04:44:28
* author:lhm
* for example
* include 'ThumbImages.class.php'
* $th=new ThumbImages(array('imagePre'=>'',
* 'imagePath'=>'./uploads/thumb/',
* 'echoType'=>'file'));
* $th->setThumb($srcImage, 384, 300, 'prorate');
*/
private $imagepre; //缩略图名称前缀
private $imagepath; //缩略图存放路径
private $srcImage=''; //源图路径
private $newImageName; //缩略图名称
private $imageType; //图片类型
private $echotype; //输出图片类型,link--直接输出到浏览器;file--保存为文件
private $im=''; //临时变量
private $originName=''; //源图名称
private $srcW=''; //源图宽
private $srcH=''; //源图高
private $errorNum=0; //错误号
private $errorMess='';//用来提供错误报告 public function __construct($options = array()){
$allowOption = array('imagepre','imagepath','echotype');
foreach($options as $key=>$val){
$key = strtolower($key);
//查看用户参数中数组的下标是否和成员属性名相同
//if(!in_array($key,get_class_vars(get_class($this)))){
if(!in_array($key, $allowOption)){
$this->errorNum = -3;
$this->errorMess = $this->getError();
continue 1;
}
$this->$key = $val;
}
}
/**
*
* 判断源文件路径、缩略图存放路径是否正确
* 判断GD库是否支持缩略图格式
* 初始化图片高宽、缩略图存放路径、缩略图生成方式
* @param string $srcImage
* @param int $toW
* @param int $toH
* @param string $method
* @param string $echotype
*/
public function setThumb($srcImage = '', $toW = 0, $toH = 0, $method = 'distortion'){
$this->srcImage = $srcImage;
$imageName = explode('/', $this->srcImage);
$this->originName = $imageName[2];
//检查源文件是否存在
if(empty($srcImage) || filetype($srcImage) != 'file'){
$this->errorNum = 4;
$this->errorMess = $this->getError();
return false;
}
//检查文件上传路径
if ($this->echotype == 'file'){
if(!$this->checkImagePath()){
$this->errorMess = $this->getError();
return false;
}
}
$info = '';
$data = getimagesize($this->srcImage, $info);//获取图像大小
$this->srcW = $data[0];//宽
$this->srcH = $data[1];//高
//检查GD库
if(!$this->checkGD($data[2])){
$this->errorMess = $this->getError();
return false;
}
$this->setImageName();//设置缩略图名称
$toFile = $this->imagepath.$this->newImageName;//缩略图存放路径
$return = $this->createImageMethod($method, $toFile, $toW, $toH);
return $return;
}
/**
*
* 初始化缩略图生成方式
* prorate 按比例缩放
* distortion 扭曲型缩图
* cut 最小裁剪后的缩图
* backFill 背景填充图
* @param string $method
* @param string $toFile
* @param int $toW
* @param int $toH
*/
private function createImageMethod($method, $toFile, $toW, $toH){
switch ($method){
case 'prorate':
$return = $this->prorate($toFile, $toW, $toH);
break;
case 'cut':
$return = $this->cut($toFile, $toW, $toH);
break;
case 'backFill':
$return = $this->backFill($toFile, $toW, $toH);
break;
default:
$return = $this->distortion($toFile, $toW, $toH);
}
return $return;
}
//生成扭曲型缩图
function distortion($toFile='', $toW=0, $toH=0){
$cImg=$this->creatImage($this->im, $toW, $toH, 0, 0, 0, 0, $this->srcW, $this->srcH);
return $this->echoImage($cImg, $toFile);
imagedestroy($cImg);
} //生成按比例缩放的缩图
function prorate($toFile, $toW, $toH){
$toWH = $toW / $toH;
$srcWH = $this->srcW / $this->srcH;
if($toWH <= $srcWH){
$ftoW = $toW;
$ftoH = $ftoW * ($this->srcH / $this->srcW);
}else{
$ftoH = $toH;
$ftoW = $ftoH * ($this->srcW / $this->srcH);
}
if($this->srcW > $toW || $this->srcH > $toH){
$cImg = $this->creatImage($this->im, $ftoW, $ftoH, 0, 0, 0, 0, $this->srcW, $this->srcH);
return $this->echoImage($cImg, $toFile);
imagedestroy($cImg);
}else{
$cImg = $this->creatImage($this->im, $this->srcW, $this->srcH, 0, 0, 0, 0, $this->srcW, $this->srcH);
return $this->echoImage($cImg, $toFile);
imagedestroy($cImg);
}
} //生成最小裁剪后的缩图
private function cut($toFile, $toW, $toH){
$toWH = $toW/$toH;
$srcWH = $this->srcW / $this->srcH;
if($toWH <= $srcWH){
$ctoH = $toH;
$ctoW = $ctoH * ($this->srcW / $this->srcH);
}else{
$ctoW = $toW;
$ctoH = $ctoW * ($this->srcH / $this->srcW);
}
$allImg = $this->creatImage($this->im, $ctoW, $ctoH, 0, 0, 0, 0, $this->srcW, $this->srcH);
$cImg = $this->creatImage($allImg, $toW, $toH, 0, 0, ($ctoW-$toW) / 2, ($ctoH-$toH) / 2, $toW, $toH);
return $this->echoImage($cImg, $toFile);
imagedestroy($cImg);
imagedestroy($allImg);
} //生成背景填充的缩图
private function backFill($toFile, $toW, $toH, $bk1=255, $bk2=255, $bk3=255){
$toWH = $toW / $toH;
$srcWH = $this->srcW / $this->srcH;
if($toWH <= $srcWH){
$ftoW = $toW;
$ftoH = $ftoW * ($this->srcH / $this->srcW);
}else{
$ftoH = $toH;
$ftoW = $ftoH*($this->srcW / $this->srcH);
}
if(function_exists("imagecreatetruecolor")){
@$cImg = imagecreatetruecolor($toW,$toH);
if(!$cImg){
$cImg = imagecreate($toW,$toH);
}
}else{
$cImg = imagecreate($toW,$toH);
}
$backcolor = imagecolorallocate($cImg, $bk1, $bk2, $bk3); //填充的背景颜色
imagefilledrectangle($cImg,0,0,$toW,$toH,$backcolor);
if($this->srcW > $toW || $this->srcH > $toH){
$proImg = $this->creatImage($this->im,$ftoW,$ftoH,0,0,0,0,$this->srcW,$this->srcH);
if($ftoW < $toW){
imagecopy($cImg, $proImg, ($toW - $ftoW) / 2, 0, 0, 0, $ftoW, $ftoH);
}else if($ftoH < $toH){
imagecopy($cImg, $proImg, 0, ($toH-$ftoH) / 2, 0, 0, $ftoW, $ftoH);
}else{
imagecopy($cImg, $proImg, 0, 0, 0, 0, $ftoW, $ftoH);
}
}else{
imagecopymerge($cImg, $this->im, ($toW - $ftoW) / 2,($toH - $ftoH) / 2, 0, 0, $ftoW, $ftoH, 100);
}
return $this->echoImage($cImg, $toFile);
imagedestroy($cImg);
}
//创建图像
private function creatImage($img, $creatW, $creatH, $dstX, $dstY, $srcX, $srcY, $srcImgW, $srcImgH){
if(function_exists("imagecreatetruecolor")){
@$creatImg = imagecreatetruecolor($creatW, $creatH);
if($creatImg){
imagecopyresampled($creatImg, $img, $dstX, $dstY, $srcX, $srcY, $creatW, $creatH, $srcImgW, $srcImgH);
}else{
$creatImg=imagecreate($creatW,$creatH);
imagecopyresized($creatImg, $img, $dstX, $dstY, $srcX, $srcY, $creatW, $creatH, $srcImgW, $srcImgH);
}
}else{
$creatImg=imagecreate($creatW, $creatH);
imagecopyresized($creatImg, $img, $dstX, $dstY, $srcX, $srcY, $creatW, $creatH, $srcImgW, $srcImgH);
}
return $creatImg;
} //输出图片,link---只输出,不保存文件。file--保存为文件
function echoImage($img, $toFile){
switch($this->echotype){
case 'link':
if(function_exists('imagejpeg'))
return imagejpeg($img);
else
return imagepng($img);
break;
case 'file':
if(function_exists('imagejpeg'))
return imagejpeg($img,$toFile);
else
return imagepng($img,$toFile);
break;
}
}
/**
*
* 设置随机文件名称
* @access private
* @return string
*/
private function setRandName(){
$fileName = date("YmdHis").rand(100,999);
return $fileName.'.'.$this->imageType;
}
private function setImageName(){
if ($this->imagepre != ''){
$this->newImageName = $this->imagepre.'_'.$this->setRandName();
}else {
$this->newImageName = $this->setRandName();
}
}
/**
*
* 用来检查文件上传路径
* @access private
* @return bool
*/
private function checkImagePath(){
if(empty($this->imagepath)) {
$this->errorNum = -2;
return false;
} if(!file_exists($this->imagepath) || !is_writable($this->imagepath)){
if(!@mkdir($this->imagepath, 0755)){
$this->errorNum = -1;
return false;
}
}
return true;
}
private function checkGD($imageType){
switch ($imageType){
case 1:
if(!function_exists("imagecreatefromgif")){
$this->errorNum = 1;
return false;
}
$this->imageType = 'gif';
$this->im = imagecreatefromgif($this->srcImage);
break;
case 2:
if(!function_exists("imagecreatefromjpeg")){
$this->errorNum = 2;
return false;
}
$this->imageType = 'jpg';
$this->im = imagecreatefromjpeg($this->srcImage);
break;
case 3:
if(!function_exists("imagecreatefrompng")){
$this->errorNum = 3;
return false;
}
$this->imageType = 'png';
$this->im = imagecreatefrompng($this->srcImage);
break;
default:
$this->errorNum = 0;
return false;
}
return true;
}
/**
*
* 用于获取上传后缩略图片的文件名
* @access public
* @return string
*/
public function getNewImageName(){
return $this->newImageName;
} /**
*
* 获取上传错误信息
* @access private
* @return string
*/
private function getError(){
$str='生成缩略图<font color="red">'.$this->originName.'</font>时出错:'; switch($this->errorNum){
case 4: $str .= '没有找到需要缩略的图片';
break;
case 3: $str .= '你的GD库不能使用png格式的图片,请使用其它格式的图片!';
break;
case 2: $str .= '你的GD库不能使用jpeg格式的图片,请使用其它格式的图片!';
break;
case 1: $str .= '你的GD库不能使用GIF格式的图片,请使用Jpeg或PNG格式!';
break;
case -1: $str .= '建立存放缩略图目录失败,请重新指定缩略图目录';
break;
case -2: $str .= '必须指定缩略图的路径';
break;
case -3: $str .= '初始化参数出错';
break;
default: $str .= '末知错误';
} return $str.'<br>';
}
public function getErrorMsg() {
return $this->errorMess;
}
}

最新文章

  1. redis数据结构存储Linked List设计细节(redis的设计与实现笔记)
  2. 存到cookie里能提高性能吗?
  3. 修改WebBrowser控件的内核解决方案
  4. 关于Linux环境变量
  5. 在xcode运行编译时,编译成功,但项目中显示缺少该文件,这是只要关闭重启xcode即可。
  6. C++ 高级语法学习与总结(代码实例)
  7. SQL语句执行时间测试
  8. PHP运行方式对比
  9. 【HDOJ】4418 Time travel
  10. Ubuntu下开启root登陆
  11. zabbix通过jmx监控tomcat
  12. Java Metrics
  13. 一对TCP协议及OSI简介模式
  14. 计算机改名引发的ORA
  15. 2n皇后问题
  16. gcc链接,去掉不用的函数和data
  17. supervisor管理nginx
  18. 蓝桥杯 入门训练 Fibonacci数列 解析
  19. Vue学习入门
  20. youcompleteme 自动补全

热门文章

  1. C#学习笔记----静态字段和静态方法
  2. poj 1459 网络流问题`EK
  3. HTML5的JavaScript选择器介绍
  4. vue &amp; lifecycle methods &amp; this bug &amp; ES6 Arrow function &amp; this bind bug
  5. [AGC011E] Increasing Numbers [数学]
  6. [POI2015][bzoj4383] Pustynia [线段树优化建图+拓扑排序]
  7. 《c程序设计语言》读书笔记-3.4-数字转字符串
  8. Windows 2008 R2无法打补丁
  9. CodeForces - 789B B. Masha and geometric depression---(水坑 分类讨论)
  10. 模拟Json格式传值请求与数据接收