php实现上传图片生成缩略图示例


Posted in PHP onApril 13, 2014

功能很简单,代码中有注释,直接给大家上代码了

<?php
/**
 * 上传图片生成缩略图
 * 
 * 需要GD2库的支持
 * 
 * 初始化时需要参数new thumbnails('需要缩略的图片的原始地址','缩略图的宽度','缩略图的高度','(可选参数)缩略图的保存路径');
 * 如果最后一个参数不指定,那么缩略图就默认保存在原始图片的所在目录里的small文件夹里,
 * 如果不存在small文件夹,则会自动创建small文件夹
 * 
 * 初始化之后需要调用方法produce创建缩略图
 * $thumbnails = new thumbnails(''....);
 * $thumbnails->produce();
 * 
 * 其中可以获取原始图片的相关信息,宽度、高度、和图片mime
 * 
 * $thumbnails->getImageWidth(); //int 图片宽度
 * $thumbnails->getImageHeight(); // int 图片高度
 * $thumbnails->getImageMime(); // string 图片的mime
 * 
 * $thumbnails->trueSize(); //array 这是一个包含图片等比例缩略之后的宽度和高度值的数组
 * $size = array('width'=>'','height'=>'');
 * 获取图片等比缩略之后的宽度和高度
 * $size['width']//等比缩略图的宽度
 * $size['height']//等比缩略图的高度
 * 
 */
class thumbnails{ private $imgSrc; //图片的路径
 private $saveSrc; //图片的保存路径,默认为空
 private $canvasWidth; //画布的宽度
 private $canvasHeight; //画布的高度
 private $im; //画布资源
 private $dm; //复制图片返回的资源
 /**
  * 初始化类,加载相关设置
  * 
  * @param $imgSrc 需要缩略的图片的路径
  * @param $canvasWidth 缩略图的宽度
  * @param $canvasHeight 缩略图的高度
  */
 public function __construct($imgSrc,$canvasWidth,$canvasHeight,$saveSrc=null)
 {
  $this->imgSrc = $imgSrc;
  $this->canvasWidth = $canvasWidth;
  $this->canvasHeight = $canvasHeight;
  $this->saveSrc = $saveSrc;
 }
 /**
  * 生成缩略图
  */
 public function produce()
 {
  $this->createCanvas();
  $this->judgeImage();
  $this->copyImage();
  $this->headerImage(); 
 }
 /**
  * 获取载入图片的信息
  * 
  * 包含长度、宽度、图片类型
  * 
  * @return array 包含图片长度、宽度、mime的数组
  */
 private function getImageInfo()
 {
  return getimagesize($this->imgSrc);
 }
 /**
  * 获取图片的长度
  * 
  * @return int 图片的宽度
  */
 public function getImageWidth()
 {
  $imageInfo = $this->getImageInfo();
  return $imageInfo['0'];
 }
 /**
  * 获取图片高度
  * 
  * @return int 图片的高度
  */
 public function getImageHeight()
 {
  $imageInfo = $this->getImageInfo();
  return $imageInfo['1'];
 }
 /**
  * 获取图片的类型
  * 
  * @return 图片的mime值
  */
 public function getImageMime()
 {
  $imageInfo = $this->getImageInfo();
  return $imageInfo['mime'];
 }
 /**
  * 创建画布
  * 
  * 同时将创建的画布资源放入属性$this->im中
  */
 private function createCanvas()
 {
  $size = $this->trueSize();
  $this->im = imagecreatetruecolor($size['width'],$size['height']);
 }
 /**
  * 判断图片的mime值,确定使用的函数
  * 
  * 同时将创建的图片资源放入$this->dm中
  */
 private function judgeImage()
 {
  $mime = $this->getImageMime();
  switch ($mime)
  {
   case 'image/png':$dm = imagecreatefrompng($this->imgSrc);
   break;
   case 'image/gif':$dm = imagecreatefromgif($this->imgSrc);
   break;
   case 'image/jpg':$dm = imagecreatefromjpeg($this->imgSrc);
   break;
   case 'image/jpeg':$dm = imagecreatefromgjpeg($this->imgSrc);
   break;
  }
  $this->dm = $dm;
 }
 /**
  * 判断图片缩略后的宽度和高度
  * 
  * 此宽度和高度也作为画布的尺寸
  *
  * @return array 图片经过等比例缩略之后的尺寸
  */
 public function trueSize()
 {
  $proportionW = $this->getImageWidth() / $this->canvasWidth;
  $proportionH = $this->getImageHeight() / $this->canvasHeight;
  if( ($this->getImageWidth() < $this->canvasWidth) && ($this->getImageHeight() < $this->canvasHeight) )
  {
   $trueSize = array('width'=>$this->getImageWidth(),'height'=>$this->getImageHeight());
  }
  elseif($proportionW >= $proportionH)
  {
   $trueSize = array('width'=>$this->canvasWidth,'height'=>$this->getImageHeight() / $proportionW);
  }
  else
  {
   $trueSize = array('width'=>$this->getImageWidth() / $proportionH,'height'=>$this->canvasHeight);
  }
  return $trueSize;
 }
 /**
  * 将图片复制到新的画布上面
  * 
  * 图片会被等比例的缩放,不会变形
  */
 private function copyImage()
 {
  $size = $this->trueSize();
  imagecopyresized($this->im, $this->dm , 0 , 0 , 0 , 0 , $size['width'] , $size['height'] , $this->getImageWidth() , $this->getImageheight());
 }
 /**
  * 将图片输出
  * 
  * 图片的名称默认和原图片名称相同
  * 
  * 路径为大图片当前目录下的small目录内
  * 
  * 如果small目录不存在,则会自动创建
  */
 public function headerImage()
 {
  $position = strrpos($this->imgSrc,'/');
  $imageName = substr($this->imgSrc,($position + 1));
  if($this->saveSrc)
  {
   $imageFlode = $this->saveSrc.'/';
  }
  else 
  {
   $imageFlode = substr($this->imgSrc,0,$position).'/small/';
  }
  if(!file_exists($imageFlode))
  {
   mkdir($imageFlode);
  }
  $saveSrc = $imageFlode.$imageName;
  imagejpeg($this->im,$saveSrc);
 } 
}
PHP 相关文章推荐
WINDOWS服务器安装多套PHP的另类解决方案
Oct 09 PHP
php与php MySQL 之间的关系
Jul 17 PHP
php 抽象类的简单应用
Sep 06 PHP
php gzip压缩输出的实现方法
Apr 27 PHP
使用phpstorm和xdebug实现远程调试的方法
Dec 29 PHP
深入了解PHP中的Array数组和foreach
Nov 06 PHP
PHP未登录自动跳转到登录页面
Dec 21 PHP
phpstudy默认不支持64位php的解决方法
Feb 20 PHP
Laravel中log无法写入问题的解决
Jun 17 PHP
PHP编程获取图片的主色调的方法【基于Imagick扩展】
Aug 02 PHP
php中的explode()函数实例介绍
Jan 18 PHP
thinkphp5 路由分发原理
Mar 18 PHP
php使用curl和正则表达式抓取网页数据示例
Apr 13 #PHP
PHP header()函数常用方法总结
Apr 11 #PHP
开源php中文分词系统SCWS安装和使用实例
Apr 11 #PHP
PHP获取网页标题的3种实现方法代码实例
Apr 11 #PHP
PHP动态生成javascript文件的2个例子
Apr 11 #PHP
php实现数组筛选奇数和偶数示例
Apr 11 #PHP
php求正负数数组中连续元素最大值示例
Apr 11 #PHP
You might like
PHP文本操作类
2006/11/25 PHP
PHP中ADODB类详解
2008/03/25 PHP
PHP错误Cannot use object of type stdClass as array in错误的解决办法
2014/06/12 PHP
PHP通过加锁实现并发情况下抢码功能
2016/08/10 PHP
PHP高效获取远程图片尺寸和大小的实现方法
2017/10/20 PHP
PHP实现基于图的深度优先遍历输出1,2,3...n的全排列功能
2017/11/10 PHP
PHP后台备份MySQL数据库的源码实例
2019/03/18 PHP
写给想学习Javascript的朋友一点学习经验小结
2010/11/23 Javascript
jquery表单验证框架提供的身份证验证方法(示例代码)
2013/12/27 Javascript
20分钟成功编写bootstrap响应式页面 就这么简单
2016/05/12 Javascript
AngularJS中的包含详细介绍及实现示例
2016/07/28 Javascript
详解Javascript获取缓存和清除缓存API
2017/05/25 Javascript
JavaScript贪吃蛇小组件实例代码
2017/08/20 Javascript
vue实现手机号码抽奖上下滚动动画示例
2017/10/18 Javascript
Vue 页面状态保持页面间数据传输的一种方法(推荐)
2018/11/01 Javascript
浅谈一种让小程序支持JSX语法的新思路
2019/06/16 Javascript
[44:04]OG vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
[08:38]DOTA2-DPC中国联赛 正赛 VG vs Elephant 选手采访
2021/03/11 DOTA
python 打印对象的所有属性值的方法
2016/09/11 Python
详解python 拆包可迭代数据如tuple, list
2017/12/29 Python
Python Flask 搭建微信小程序后台详解
2019/05/06 Python
Ubuntu18.04下python版本完美切换的解决方法
2019/06/14 Python
CentOS7下安装python3.6.8的教程详解
2020/01/03 Python
Python 实现自动获取种子磁力链接方式
2020/01/16 Python
django ListView的使用 ListView中获取url中的参数值方式
2020/03/27 Python
python 基于opencv 绘制图像轮廓
2020/12/11 Python
夏威夷咖啡公司:Hawaii Coffee Company
2019/09/19 全球购物
行政助理岗位职责
2013/11/10 职场文书
司机检讨书
2014/02/13 职场文书
学习型党组织建设经验材料
2014/05/26 职场文书
通信工程专业求职信
2014/06/04 职场文书
2014年教师党员自我评议
2014/09/19 职场文书
元旦晚会开场白
2015/05/29 职场文书
Python机器学习三大件之一numpy
2021/05/10 Python
Java基于字符界面的简易收银台
2021/06/26 Java/Android
《辉夜大小姐想让我告白》第三季正式预告
2022/03/20 日漫