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 相关文章推荐
php AJAX实例根据邮编自动完成地址信息
Nov 23 PHP
PHP去掉从word直接粘贴过来的没有用格式的函数
Oct 29 PHP
php-fpm配置详解
Feb 12 PHP
兼容各大浏览器带关闭按钮的漂浮多组图片广告代码
Jun 05 PHP
PHP之正则表达式捕获组与非捕获组(详解)
Jul 29 PHP
详解php设置session(过期、失效、有效期)
Nov 12 PHP
thinkphp3.2点击刷新生成验证码
Feb 16 PHP
PhpStorm terminal无法输入命令的解决方法
Oct 09 PHP
php 实现一个字符串加密解密的函数实例代码
Nov 01 PHP
学习thinkphp5.0验证类使用方法
Nov 16 PHP
tp5(thinkPHP5框架)captcha验证码配置及验证操作示例
May 28 PHP
php接口隔离原则实例分析
Nov 11 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
全国FM电台频率大全 - 12 安徽省
2020/03/11 无线电
php中sprintf与printf函数用法区别解析
2014/02/17 PHP
在PHP站点的页面上添加Facebook评论插件的实例教程
2016/01/08 PHP
php5.4传引用时报错问题分析
2016/01/22 PHP
Zend Framework框架路由机制代码分析
2016/03/22 PHP
网页设计常用的一些技巧
2006/12/22 Javascript
javascript高级学习笔记整理
2011/08/14 Javascript
event.X和event.clientX的区别分析
2011/10/06 Javascript
浅析用prototype定义自己的方法
2013/11/14 Javascript
javascript 获取元素样式必杀技
2014/05/04 Javascript
javascript实现阻止iOS APP中的链接打开Safari浏览器
2014/06/12 Javascript
jQuery中prevAll()方法用法实例
2015/01/08 Javascript
Node.js事件循环(Event Loop)和线程池详解
2015/01/28 Javascript
使用Jquery实现每日签到功能
2015/04/03 Javascript
HTML5canvas 绘制一个圆环形的进度表示实例
2016/12/16 Javascript
angular 动态组件类型详解(四种组件类型)
2017/02/22 Javascript
JavaScript数组和对象的复制
2017/03/21 Javascript
AngularJS上传文件的示例代码
2018/11/10 Javascript
浅谈react-router@4.0 使用方法和源码分析
2019/06/04 Javascript
微信小程序canvas动态时钟
2020/10/22 Javascript
[01:25]2014DOTA2国际邀请赛 zhou分析LGD比赛情况
2014/07/14 DOTA
使用Python构建Hopfield网络的教程
2015/04/14 Python
Python的Django框架使用入门指引
2015/04/15 Python
深入解析Python中的descriptor描述器的作用及用法
2016/06/27 Python
opencv转换颜色空间更改图片背景
2019/08/20 Python
Python 实现Serial 与STM32J进行串口通讯
2019/12/18 Python
Python 使用SFTP和FTP实现对服务器的文件下载功能
2020/12/17 Python
突袭HTML5之Javascript API扩展3—本地存储全新体验
2013/01/31 HTML / CSS
DHC中国官方购物网站:日本通信销售No.1化妆品
2016/08/20 全球购物
自我鉴定注意事项
2014/01/19 职场文书
奠基仪式主持词
2014/03/20 职场文书
工商管理专业自荐信
2014/06/03 职场文书
大一学生个人总结
2015/02/15 职场文书
教你用Python写一个植物大战僵尸小游戏
2021/04/25 Python
Python字典的基础操作
2021/11/01 Python
使用Ajax实现无刷新上传文件
2022/04/12 Javascript