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 相关文章推荐
第十二节--类的自动加载
Nov 16 PHP
phpmyadmin显示utf8_general_ci中文乱码的问题终级篇
Apr 08 PHP
微信营销平台系统?刮刮乐的开发
Jun 10 PHP
yii2-GridView在开发中常用的功能及技巧总结
Jan 07 PHP
PHP文件系统管理(实例讲解)
Sep 19 PHP
PHP设计模式之建造者模式定义与用法简单示例
Aug 13 PHP
PHP实现微信商户支付企业付款到零钱功能
Sep 30 PHP
浅谈PHP封装CURL
Mar 06 PHP
PHP实现支持CURL字符串证书传输的方法
Mar 23 PHP
laravel实现登录时监听事件,添加登录用户的记录方法
Sep 30 PHP
php 命名空间(namespace)原理与用法实例小结
Nov 13 PHP
PHP的垃圾回收机制代码实例讲解
Feb 27 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/08/05 PHP
PHP实现的通过参数生成MYSQL语句类完整实例
2016/04/11 PHP
php简单实现短网址(短链)还原的方法(测试可用)
2016/05/09 PHP
laravel框架创建授权策略实例分析
2019/11/22 PHP
最新28个很棒的jQuery 教程
2011/05/28 Javascript
js获取电脑分辨率的思路及操作
2013/11/22 Javascript
Node.js巧妙实现Web应用代码热更新
2015/10/22 Javascript
标准的js无缝滚动效果
2016/08/30 Javascript
解析JavaScript模仿块级作用域
2016/12/29 Javascript
jquery滚动条插件slimScroll使用方法
2017/02/09 Javascript
JavaScript中document.referrer的用法详解
2017/07/04 Javascript
用js实现before和after伪类的样式修改的示例代码
2017/09/07 Javascript
vue+element-ui+ajax实现一个表格的实例
2018/03/09 Javascript
nodejs中实现用户注册路由功能
2019/05/20 NodeJs
Python 提取dict转换为xml/json/table并输出的实现代码
2016/08/28 Python
python实现按任意键继续执行程序
2016/12/30 Python
Python操作SQLite数据库的方法详解【导入,创建,游标,增删改查等】
2017/07/11 Python
利用Django-environ如何区分不同环境
2018/08/26 Python
python dlib人脸识别代码实例
2019/04/04 Python
python字典的遍历3种方法详解
2019/08/10 Python
python在OpenCV里实现投影变换效果
2019/08/30 Python
Python类的绑定方法和非绑定方法实例解析
2020/03/04 Python
Pycharm在指定目录下生成文件和删除文件的实现
2020/12/28 Python
css3 条纹化和透明化表格Firefox下测试成功
2014/04/15 HTML / CSS
MCAKE蛋糕官方网站:一直都是巴黎的味道
2018/02/06 全球购物
彪马香港官方网上商店:PUMA香港
2020/12/06 全球购物
如何启动时不需输入用户名与密码
2014/05/09 面试题
播音主持女孩的自我评价分享
2013/11/20 职场文书
厂办主管岗位职责范本
2014/02/28 职场文书
根叔历年演讲稿
2014/05/20 职场文书
宾馆仓管员岗位职责
2014/07/27 职场文书
创优争先心得体会
2014/09/11 职场文书
领导班子群众路线与四风问题对照检查材料思想汇报
2014/10/11 职场文书
北京爱情故事观后感
2015/06/12 职场文书
SONY AN-LP1 短波有源天线放大器
2021/04/22 无线电
利用 JavaScript 构建命令行应用
2021/11/17 Javascript