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 相关文章推荐
第八节 访问方式 [8]
Oct 09 PHP
php学习 字符串课件
Jun 15 PHP
php simplexmlElement操作xml的命名空间实现代码
Jan 04 PHP
php 保留字列表
Oct 04 PHP
PHP ajax 异步执行不等待执行结果的处理方法
May 27 PHP
ThinkPHP设置禁止百度等搜索引擎转码(简单实用)
Feb 15 PHP
PHP程序中的文件锁、互斥锁、读写锁使用技巧解析
Mar 21 PHP
利用php-cli和任务计划实现订单同步功能的方法
May 03 PHP
PHP实现对xml进行简单的增删改查(CRUD)操作示例
May 19 PHP
Django 标签筛选的实现代码(一对多、多对多)
Sep 05 PHP
PHP中16个高危函数整理
Sep 19 PHP
PHP读取文件,解决中文乱码UTF-8的方法分析
Jan 22 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
晶体管单管来复再生式收音机
2021/03/02 无线电
PHP的array_diff()函数在处理大数组时的效率问题
2011/11/27 PHP
ThinkPHP实现递归无级分类――代码少
2015/07/29 PHP
Thinkphp5框架实现图片、音频和视频文件的上传功能详解
2019/08/27 PHP
javaScript 读取和设置文档元素的样式属性
2009/04/14 Javascript
window.addEventListener来解决让一个js事件执行多个函数
2012/12/26 Javascript
使用Nodejs开发微信公众号后台服务实例
2014/09/03 NodeJs
jQuery实现ctrl+enter(回车)提交表单
2015/10/19 Javascript
快速掌握Node.js事件驱动模型
2016/03/21 Javascript
jQuery实现左侧导航模块的显示与隐藏效果
2016/07/04 Javascript
vue中v-model动态生成的实例详解
2017/10/27 Javascript
详解vue移动端项目的适配(以mint-ui为例)
2018/08/17 Javascript
jQuery常见的遍历DOM操作详解
2018/09/05 jQuery
js中innerText/textContent和innerHTML与target和currentTarget的区别
2019/01/21 Javascript
jQuery 判断元素是否存在然后按需加载内容的实现代码
2020/01/16 jQuery
vue如何在项目中调用腾讯云的滑动验证码
2020/07/15 Javascript
记一次vue跨域的解决
2020/10/21 Javascript
[53:52]OG vs EG 2018国际邀请赛淘汰赛BO3 第二场 8.23
2018/08/24 DOTA
Python获取文件所在目录和文件名的方法
2017/01/12 Python
关于numpy中np.nonzero()函数用法的详解
2017/02/07 Python
使用selenium模拟登录解决滑块验证问题的实现
2019/05/10 Python
python flask框架实现传数据到js的方法分析
2019/06/11 Python
简单了解python反射机制的一些知识
2019/07/13 Python
利用PyQt中的QThread类实现多线程
2020/02/18 Python
基于python3实现倒叙字符串
2020/02/18 Python
pytorch随机采样操作SubsetRandomSampler()
2020/07/07 Python
印度在线杂货店:bigbasket
2018/08/23 全球购物
电子商务专业自我鉴定
2013/12/18 职场文书
经典英文广告词
2014/03/18 职场文书
2014年教师党员自我评议
2014/09/19 职场文书
上诉状格式
2015/05/23 职场文书
奔腾年代观后感
2015/06/09 职场文书
学校少先队工作总结
2015/08/12 职场文书
员工给公司的建议书
2019/06/24 职场文书
DE1107机评
2022/04/05 无线电
Python日志模块logging用法
2022/06/05 Python