PHP缩略图类
2024-10-03 08:41:39
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;
}
}
最新文章
- redis数据结构存储Linked List设计细节(redis的设计与实现笔记)
- 存到cookie里能提高性能吗?
- 修改WebBrowser控件的内核解决方案
- 关于Linux环境变量
- 在xcode运行编译时,编译成功,但项目中显示缺少该文件,这是只要关闭重启xcode即可。
- C++ 高级语法学习与总结(代码实例)
- SQL语句执行时间测试
- PHP运行方式对比
- 【HDOJ】4418 Time travel
- Ubuntu下开启root登陆
- zabbix通过jmx监控tomcat
- Java Metrics
- 一对TCP协议及OSI简介模式
- 计算机改名引发的ORA
- 2n皇后问题
- gcc链接,去掉不用的函数和data
- supervisor管理nginx
- 蓝桥杯 入门训练 Fibonacci数列 解析
- Vue学习入门
- youcompleteme 自动补全
热门文章
- C#学习笔记----静态字段和静态方法
- poj 1459 网络流问题`EK
- HTML5的JavaScript选择器介绍
- vue &; lifecycle methods &; this bug &; ES6 Arrow function &; this bind bug
- [AGC011E] Increasing Numbers [数学]
- [POI2015][bzoj4383] Pustynia [线段树优化建图+拓扑排序]
- 《c程序设计语言》读书笔记-3.4-数字转字符串
- Windows 2008 R2无法打补丁
- CodeForces - 789B B. Masha and geometric depression---(水坑 分类讨论)
- 模拟Json格式传值请求与数据接收