PHP批量生成图片缩略图的方法


Posted in PHP onJune 18, 2015

本文实例讲述了PHP批量生成图片缩略图的方法。分享给大家供大家参考。具体如下:

<?php
//用PHP批量生成图片缩略图
 function mkdirs($dirname,$mode=0777)
 //创建目录(目录, [模式])
 {
  if(!is_dir($dirname))
  {
   mkdirs($dirname,$mode); //如果目录不存在,递归建立
   return mkdir($dirname,$mode);
  }
  return true;
 }
 function savefile($filename,$content='')
 //保存文件(文件, [内容])
 {
  if(function_exists(file_put_contents))
  {
   file_put_contents($filename,$content);
  }
  else
  {
   $fp=fopen($filename,"wb");
   fwrite($fp,$content);
   fclose($fp);
  }
 }
 function getsuffix($filename) //获取文件名后缀
 {
  return end(explode(".",$filename));
 }
 function checksuffix($filename,$arr) //是否为允许类型(当前, 允许)
 {
  if(!is_array($arr))
  {
   $arr=explode(",",str_replace(" ","",$arr));
  }
  return in_array($filename,$arr) ? 1 : 0;
 }
 class image
 {
  var $src; //源地址
  var $newsrc; //新图路径(本地化后)
  var $allowtype=array(".gif",".jpg",".png",".jpeg"); //允许的图片类型
  var $regif=0; //是否缩略GIF, 为0不处理
  var $keep=0; //是否保留源文件(1为保留, 0为MD5)
  var $over=0; //是否可以覆盖已存在的图片,为0则不可覆盖
  var $dir; //图片源目录
  var $newdir; //处理后的目录
  function __construct($olddir=null,$newdir=null)
  {
   $this->dir=$olddir ? $olddir : "./images/temp";
   $this->newdir=$newdir ? $newdir : "./images/s";
  }
  function reNames($src)
  {
   $md5file=substr(md5($src),10,10).strrchr($src,".");
   //MD5文件名后(例如:3293okoe.gif)
   $md5file=$this->w."_".$this->h."_".$md5file;
   //处理后文件名
   return $this->newdir."/".$md5file;
   //将源图片,MD5文件名后保存到新的目录里
  }
  function Mini($src,$w,$h,$q=80)
  //生成缩略图 Mini(图片地址, 宽度, 高度, 质量)
  {
   $this->src=$src;
   $this->w=$w;
   $this->h=$h;
   if(strrchr($src,".")==".gif" && $this->regif==0)
   //是否处理GIF图
   {
    return $this->src;
   }
   if($this->keep==0) //是否保留源文件,默认不保留
   {
    $newsrc=$this->reNames($src); //改名后的文件地址
   }
   else     //保持原名
   {
    $src=str_replace("\\","/",$src);
    $newsrc=$this->newdir.strrchr($src,"/");
   }
   if(file_exists($newsrc) && $this->over==0)
   //如果已存在,直接返回地址
   {
    return $newsrc;
   }
   if(strstr($src,"http://") && !strstr($src,$_SERVER['HTTP_HOST']))
   //如果是网络文件,先保存
   {
    $src=$this->getimg($src);
   }
   $arr=getimagesize($src); //获取图片属性
   $width=$arr[0];
   $height=$arr[1];
   $type=$arr[2];
   switch($type)
   {
    case 1:  //1 = GIF,
     $im=imagecreatefromgif($src);
     break;
    case 2:  //2 = JPG
     $im=imagecreatefromjpeg($src);
     break;
    case 3:  //3 = PNG
     $im=imagecreatefrompng($src);
     break;
    default:
     return 0;
   }
   //处理缩略图
   $nim=imagecreatetruecolor($w,$h);
   $k1=round($h/$w,2);
   $k2=round($height/$width,2);
   if($k1<$k2)
   {
    $width_a=$width;
    $height_a=round($width*$k1);
    $sw=0;
    $sh=($height-$height_a)/2;
   }
   else
   {
     $width_a=$height/$k1;
     $height_a=$height;
     $sw=($width-$width_a)/2;
     $sh = 0;
   }
   //生成图片
   if(function_exists(imagecopyresampled))
   {
    imagecopyresampled($nim,$im,0,0,$sw,$sh,$w,$h,$width_a,$height_a);
   }
   else
   {
    imagecopyresized($nim,$im,0,0,$sw,$sh,$w,$h,$width_a,$height_a);
   }
   if(!is_dir($this->newdir))
   {
    mkdir($this->newdir);
   }
   switch($type)  //保存图片
   {
    case 1:
     $rs=imagegif($nim,$newsrc);
     break;
    case 2:
     $rs=imagejpeg($nim,$newsrc,$q);
     break;
    case 3:
     $rs=imagepng($nim,$newsrc);
     break;
    default:
     return 0;
   }
   return $newsrc; //返回处理后路径
  }
  function getimg($filename)
  {
   $md5file=$this->dir."/".substr(md5($filename),10,10).strrchr($filename,".");
   if(file_exists($md5file))
   {
    return $md5file;
   }
   //开始获取文件,并返回新路径
   $img=file_get_contents($filename);
   if($img)
   {
    if(!is_dir($this->dir))
    {
     mkdir($this->dir);
    }
    savefile($md5file,$img);
    return $md5file;
   }
  }
  function reImg($src,$w,$h,$q)
  //转换缩略图(文件名和结构不变)
  {
   $this->keep=1;
   return $this->Mini($src,$w,$h,$q);
   //return 生成的地址
  }
 }
 $image=new image();
 echo $image->reImg("images/zht.jpg",75,75,80);
 echo "<br/>";
 echo $image->reImg("images/m8920.jpg",75,75,80);
 echo "<br/>";
 echo $image->getimg("./images/s/zht.jpg");
?>

希望本文所述对大家的php程序设计有所帮助。

PHP 相关文章推荐
图象函数中的中文显示
Oct 09 PHP
php smarty模版引擎中的缓存应用
Dec 11 PHP
PHP 设置MySQL连接字符集的方法
Jan 02 PHP
PHP的curl实现get,post和cookie(实例介绍)
Jun 17 PHP
linux中cd命令使用详解
Jan 08 PHP
Laravel 5框架学习之表单
Apr 08 PHP
php和editplus正则表达式去除空白行
Apr 17 PHP
[原创]php逐行读取txt文件写入数组的方法
Jul 02 PHP
详解YII关联查询
Jan 10 PHP
PHP中如何使用Redis接管文件存储Session详解
Nov 28 PHP
PHP+MySQL实现在线测试答题实例
Jan 02 PHP
如何使用php生成zip压缩包
Apr 21 PHP
基于php的CMS中展示文章类实例分析
Jun 18 #PHP
php实现的用户查询类实例
Jun 18 #PHP
php常用表单验证类用法实例
Jun 18 #PHP
php文件压缩之PHPZip类用法实例
Jun 18 #PHP
浅谈php中include文件变量作用域
Jun 18 #PHP
Apache连接PHP后无法启动问题解决思路
Jun 18 #PHP
php实现只保留mysql中最新1000条记录
Jun 18 #PHP
You might like
使用Limit参数优化MySQL查询的方法
2008/11/12 PHP
PHP5.4中json_encode中文转码的变化小结
2013/01/30 PHP
PHP PDOStatement::fetch讲解
2019/01/31 PHP
PHP常用的类封装小结【4个工具类】
2019/06/28 PHP
PHP 模拟登陆功能实例详解
2019/09/10 PHP
PHP 构造函数和析构函数原理与用法分析
2020/04/21 PHP
jQuery实现的Email中的收件人效果(按del键删除)
2011/03/20 Javascript
jquery验证手机号码、邮箱格式是否正确示例代码
2013/07/28 Javascript
JS+CSS实现可以凹陷显示选中单元格的方法
2015/03/02 Javascript
基于jquery实现表格无刷新分页
2016/01/07 Javascript
实例讲解JavaScript中的this指向错误解决方法
2016/06/13 Javascript
微信小程序开发之相册选择和拍照详解及实例代码
2017/02/22 Javascript
vue 2.x 中axios 封装的get 和post方法
2018/02/28 Javascript
jQuery easyui datagird编辑行删除行功能的实现代码
2018/09/20 jQuery
JS实现的贪吃蛇游戏完整实例
2019/01/18 Javascript
JavaScript 正则应用详解【模式、欲查、反向引用等】
2020/05/13 Javascript
在VUE style中使用data中的变量的方法
2020/06/19 Javascript
Node 使用express-http-proxy 做api网关的实现
2020/10/15 Javascript
关于Vue中$refs的探索浅析
2020/11/05 Javascript
[00:43]2016完美“圣”典风云人物:单车宣传片
2016/12/02 DOTA
使用tensorflow实现AlexNet
2017/11/20 Python
python format 格式化输出方法
2018/07/16 Python
解决在Python编辑器pycharm中程序run正常debug错误的问题
2019/01/17 Python
一行python实现树形结构的方法
2019/08/09 Python
Kears+Opencv实现简单人脸识别
2019/08/28 Python
基于pygame实现童年掌机打砖块游戏
2020/02/25 Python
python构造IP报文实例
2020/05/05 Python
Pycharm的Available Packages为空的解决方法
2020/09/18 Python
澳大利亚办公室装修:JasonL Office Furniture
2019/06/25 全球购物
C++面试题目
2013/06/25 面试题
详解如何解决使用JSON.stringify时遇到的循环引用问题
2021/03/23 Javascript
党校学习自我鉴定
2014/02/24 职场文书
小学家长评语大全
2014/04/16 职场文书
优秀毕业生就业推荐信
2014/05/22 职场文书
学习三严三实对照检查材料思想汇报
2014/09/22 职场文书
师德标兵先进事迹材料
2014/12/19 职场文书