PHP缩略图类
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;
}
}
PHP缩略图类的更多相关文章
- pdo文字水印类,验证码类,缩略图类,logo类
文字水印类 image.class.php <?php /** * webrx.cn qq:7031633 * @author webrx * @copyright copyright (c) ...
- php四个常用类封装 :MySQL类、 分页类、缩略图类、上传类;;分页例子;
Mysql类 <?php /** * Mysql类 */ class Mysql{ private static $link = null;//数据库连接 /** * 私有的构造方法 */ pr ...
- 【PHP缩略图类】手机照片不能生成缩略图问题以及解决方式
[本文原创,谢绝转载] 一.出现的问题 这几天做了手机上传照片并裁出缩略图的接口的測试,发现无论怎么.生成的缩略图都是一片漆黑.:-( 然后就把这个缩略图类单拿出来进行測试,发现仅仅要是手机拍出来的照 ...
- PHP原生写的生成图片缩略图类
PHP原生写的生成图片缩略图类,本文以京东商品图片为例,分别生成三种不同尺寸的图片.调用方法很简单只要传参数高度和宽度,及新图片的名称. 引入缩略图类 include_once 'ImageResiz ...
- php-验证码类-PDO类-缩略图类
Verify.class.php 验证码类 <?php class Verify{ const VERIFY_TYPE_NUM=1; const VERIFY_TYPE_EN=2; const ...
- .NET 等宽、等高、等比例、固定宽高生成缩略图 类
#region 根据原图片生成等比缩略图 /// <summary> /// 根据源图片生成缩略图 /// </summary> /// <param name=&quo ...
- ThinkPHP3验证码、文件上传、缩略图、分页(自定义工具类、session和cookie)
验证码 TP框架中自带了验证码类 位置:Think/verify.class.php 在LoginController控制器中创建生存验证码的方法 login.html登陆模板中 在LoginCont ...
- PHPThumb处理图片,生成缩略图,图片尺寸调整,图片截取,图片加水印,图片旋转
[强烈推荐]下载地址(github.com/masterexploder/PHPThumb). 注意这个类库有一个重名的叫phpThumb,只是大小写的差别,所以查找文档的时候千万注意. 在网站建设过 ...
- php生成图片缩略图,支持png透明
注:此功能依赖GD2图形库 PHP生成缩略图类 <?php /* * desc: Resize Image(png, jpg, gif) * author: 十年后的卢哥哥(http://w ...
随机推荐
- 台州学院we are without brain 训练 后缀数组
sa[i]表示排名为 i 的后缀的第一个字符在原串中的位置 rank[i]表示按照从小到大排名 以i为下标开始的后缀的排名 height[i]表示排名为 i 和排名为 i+1的后缀的最长公共前缀的长 ...
- UVALive 4764 简单dp水题(也可以暴力求解)
B - Bing it Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Submit Status ...
- over窗口函数进阶
over窗口函数的其他灵活的用法.即,统计当前行的前N行及后N行数据.转自:https://blog.csdn.net/ck3207/article/details/84954511 先来看一下数据的 ...
- 修复linux密码
To reset the root password of your server, you will need to boot into single user mode. Access the M ...
- [bzoj4712] 洪水 [树链剖分+线段树+dp]
题面 传送门 思路 DP方程 首先,这题如果没有修改操作就是sb题,dp方程如下 $dp[u]=max(v[u],max(dp[v]))$,其中$v$是$u$的儿子 我们令$g[u]=max(dp[v ...
- jquery.jbox JBox-v2.3修改版
原版jquery.jbox是个不错的jquery扩展,使用简单,功能很多.可惜的是作者把javascript加密了,并且2011年以后就不再更新.如果项目中用到了新的jquery版本,甚至jbox就没 ...
- TCP面试题之HTTP和HTTPS的请求过程
HTTP的请求过程: 1.TCP建立连接后,客户端会发送报文给服务端: 2.服务端接收报文并作出响应: 3.客户端收到响应后解析给用户: HTTPS的请求过程: 1.客户端发送请求到服务端: 2.服务 ...
- getElementsByName
name属性,name属性是input标签的内建属性,早期浏览器的getElementsByName方法是为了方便的获取用户的输入.由于name只是input的内建属性,其它标签没有,所以getEle ...
- rest项目的基础返回类设计
package com.hmy.erp.api.vo; import java.io.Serializable; import lombok.Data; /** * erp基本状态返回类 * * @a ...
- 51Nod 1048 整数分解为2的幂 V2
题目链接 分析: $O(N)$和$O(NlogN)$的做法很简单就不写了...%了一发神奇的$O(log^3n*$高精度$)$的做法... 考虑我们只能用$2$的整次幂来划分$n$,所以我们从二进制的 ...