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 相关文章推荐
PHP中其实也可以用方法链
Nov 10 PHP
php 操作数组(合并,拆分,追加,查找,删除等)
Jul 20 PHP
无需重新编译php加入ftp扩展的解决方法
Feb 07 PHP
解析CI即CodeIgniter框架在Nginx下的重写规则
Jun 03 PHP
php去除数组中重复数据
Nov 18 PHP
PHP获取一年中每个星期的开始和结束日期的方法
Feb 12 PHP
PHP实现一维数组转二维数组的方法
Feb 25 PHP
PHP判断字符串长度的两种方法很实用
Sep 22 PHP
详解php魔术方法(Magic methods)的使用方法
Feb 14 PHP
POST一个JSON格式的数据给Restful服务实例详解
Apr 07 PHP
PHP 实现公历日期与农历日期的互转换
Sep 13 PHP
Laravel框架路由管理简单示例
May 07 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网站基础优化方法小结
2008/09/29 PHP
php中常用的预定义变量小结
2012/05/09 PHP
Jquery+ajax请求data显示在GridView上(asp.net)
2010/08/27 Javascript
Ext对基本类型的扩展 ext,extjs,format
2010/12/25 Javascript
Jquery读取URL参数小例子
2013/08/30 Javascript
将HTML格式的String转化为HTMLElement的实现方法
2014/08/07 Javascript
js仿支付宝多方框输入支付密码效果
2016/09/27 Javascript
js从输入框读取内容,比较两个数字的大小方法
2017/03/13 Javascript
angular 实现的输入框数字千分位及保留几位小数点功能示例
2018/06/19 Javascript
JS实现简单省市二级联动
2019/11/27 Javascript
node.js中 redis 的安装和基本操作示例
2020/02/10 Javascript
微信小程序单选框自定义赋值
2020/05/26 Javascript
vue-router的hooks用法详解
2020/06/08 Javascript
微信小程序视频弹幕发送功能的实现
2020/12/28 Javascript
vue实现按钮切换图片
2021/01/20 Vue.js
跟老齐学Python之模块的加载
2014/10/24 Python
Windows下安装python2.7及科学计算套装
2015/03/05 Python
Python的randrange()方法使用教程
2015/05/15 Python
Python 微信之获取好友昵称并制作wordcloud的实例
2019/02/21 Python
使用pandas读取文件的实现
2019/07/31 Python
使用selenium和pyquery爬取京东商品列表过程解析
2019/08/15 Python
关于Python核心框架tornado的异步协程的2种方法详解
2019/08/28 Python
浅谈keras中的目标函数和优化函数MSE用法
2020/06/10 Python
用python实现前向分词最大匹配算法的示例代码
2020/08/06 Python
python如何实时获取tcpdump输出
2020/09/16 Python
css3绘制百度的小度熊
2018/10/29 HTML / CSS
用css3写出气球样式的示例代码
2017/09/11 HTML / CSS
Html5 canvas画图白板踩坑
2020/06/01 HTML / CSS
英格兰足协官方商店:England Store
2019/07/12 全球购物
党校自我鉴定范文
2013/10/02 职场文书
高二美术教学反思
2014/01/14 职场文书
租房合同协议书
2014/04/09 职场文书
致青春观后感
2015/06/09 职场文书
接触艺术对孩子学习思维有益
2019/08/06 职场文书
CSS3新特性详解(五):多列columns column-count和flex布局
2021/04/30 HTML / CSS
SQL优化老出错,那是你没弄明白MySQL解释计划用法
2021/11/27 MySQL