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 相关文章推荐
图片存储与浏览一例(Linux+Apache+PHP+MySQL)
Oct 09 PHP
处理(php-cgi.exe - FastCGI 进程超过了配置的请求超时时限)的问题
Jul 03 PHP
smarty模板局部缓存方法使用示例
Jun 17 PHP
PHP中__FILE__、dirname与basename用法实例分析
Dec 01 PHP
php获取、检查类名、函数名、方法名的函数方法
Jun 25 PHP
PHP实现的简单网络硬盘
Jul 29 PHP
PHP创建文件,并向文件中写入数据,覆盖,追加的实现代码
Mar 25 PHP
php gd等比例缩放压缩图片函数
Jun 12 PHP
Laravel框架中Blade模板的用法示例
Aug 30 PHP
PHP两个n位的二进制整数相加问题的解决
Aug 26 PHP
php和vue配合使用技巧和方法
May 09 PHP
PHP+redis实现微博的拉模型案例详解
Jul 10 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中$美元符号与Zen Coding冲突问题解决方法分享
2014/05/28 PHP
深入浅出讲解:php的socket通信原理
2016/12/03 PHP
PHP PDO操作MySQL基础教程
2017/06/05 PHP
YII框架关联查询操作示例
2019/04/29 PHP
使用原生js写的一个简单slider
2014/04/29 Javascript
Javascript 读取操作Sql中的Xml字段
2014/10/09 Javascript
JavaScript之数组(Array)详解
2015/04/01 Javascript
详解Matlab中 sort 函数用法
2016/03/20 Javascript
jquery弹出遮掩层效果【附实例代码】
2016/04/28 Javascript
javascript 用函数实现继承详解
2016/05/28 Javascript
整理关于Bootstrap警示框的慕课笔记
2017/03/29 Javascript
Node.js实现mysql连接池使用事务自动回收连接的方法示例
2018/02/03 Javascript
Servlet3.0与纯javascript通过Ajax交互的实例详解
2018/03/18 Javascript
js逆向解密之网络爬虫
2019/05/30 Javascript
vue实现鼠标移过出现下拉二级菜单功能
2019/12/12 Javascript
Jquery+AJAX实现无刷新上传并重命名文件操作示例【PHP后台接收】
2020/05/29 jQuery
Nodejs环境实现socket通信过程解析
2020/07/03 NodeJs
用Python实现通过哈希算法检测图片重复的教程
2015/04/02 Python
举例讲解Python中的Null模式与桥接模式编程
2016/02/02 Python
Centos下实现安装Python3.6和Python2共存
2018/08/15 Python
Appium Python自动化测试之环境搭建的步骤
2019/01/23 Python
Python3利用Dlib实现摄像头实时人脸检测和平铺显示示例
2019/02/21 Python
Python 安装第三方库 pip install 安装慢安装不上的解决办法
2019/06/18 Python
美国宠物美容和宠物用品购物网站:Cherrybrook
2018/12/07 全球购物
方正Java笔试题
2014/07/03 面试题
好的自荐信的要求
2013/10/30 职场文书
自动化专业个人求职信范文
2013/11/29 职场文书
国际贸易毕业生求职信范文
2014/02/21 职场文书
数学高效课堂实施方案
2014/03/29 职场文书
《长城和运河》教学反思
2014/04/14 职场文书
投资协议书范本
2014/04/21 职场文书
小学教师师德演讲稿
2014/05/06 职场文书
师德模范事迹材料
2014/06/03 职场文书
领导班子在批评与自我批评座谈会上的发言
2014/09/28 职场文书
2015年物业管理员工工作总结
2015/10/15 职场文书
2015年幼师个人工作总结
2015/10/15 职场文书