PHP基于GD库的缩略图生成代码(支持jpg,gif,png格式)


Posted in PHP onJune 19, 2014

还是老规矩,直接上代码

<?php
/**
 * 缩略图生成类,使用示例:
 */

$newimage=new ImageResize();
$newimage->resize("tu.jpg","tu_lit.jpg",1000,1000);
echo $newimage->GetLastError();

class ImageResize{
  private $localimage;//原图路径
  private $remoteimage;//缩略图保存路径
  private $localinfo;//原图属性
  private $error;
      
  function resize($localimg, $remoteimg, $x, $y) {
    //检测是否支持gd图像处理
    if(!$this->_checkenv()){
      return false;
    }
    $this->localimage = $localimg;
    $this->remoteimage = $remoteimg;
    $this->localinfo = getimagesize($this->localimage); //获取本地图像的信息
    return $this->_resize($x,$y);
  }
  /**
   * 检测当前环境是否支持GD
   */
  private function _checkenv(){
    if(!function_exists('gd_info')){
      $this->error[]="当前环境不支持GD图像处理,请先安装GD库并开启PHP相关扩展";
      return false;
    }
    return true;
  }
  
  /**
   * 生成缩略图主函数
   * @param int $x 指定的缩略图宽度
   * @param int $y 指定的缩略图高度
   * @return boolean
   */
  private function _resize($x,$y){
    if(!$this->localinfo){
      $this->error[]="本地图像文件不存在";
      return false;
    }
    //创建图像句柄
    $im=@$this->_create($this->localinfo[2]);
    if(!$im){
      $this->error[]="当前GD库不支持图像类型:{$this->localinfo['mime']}";
      return false;
    }
    $dstsize=$this->_dstsize($x, $y);
    $dstim=@imagecreatetruecolor($dstsize["width"],$dstsize["height"]);
    $whitecolor=@imagecolorallocatealpha($dstim, 0, 0, 0,127);
    imagefill($dstim,0,0,$whitecolor);
    $re=@imagecopyresampled($dstim, $im, 0, 0, 0, 0, $dstsize["width"], $dstsize["height"], $this->localinfo[0], $this->localinfo[1]);
    if(!$re){
      $this->error[]="图像重新采样失败";
      return false;
    }
    if(!imagejpeg($dstim, $this->remoteimage)){
      if(!imagepng($dstim,$this->remoteimage)){
        if(!imagegif($dstim,$this->remoteimage)){
          $this->error[]="保存缩略图到{$this->remoteimage}失败,请检查gd环境是否正常和缩略图文件夹的写入权限。";
          return false;
        }
      }
    }
    $this->error[]="success";
    return true;
  }
  
  /**
   * 根据本地图片类型,创建图片资源
   * @param 图像类型代码 $code
   * @return resource/boolean 成功则返回resourse失败则返回false
   */
  private function _create($code){
    $src=$this->localimage;
    switch ($code){
      case 1:
        return imagecreatefromgif($src);
        break;
      case 2:
        return imagecreatefromjpeg($src);
        break;
      case 3:
        return imagecreatefrompng($src);
        break;
      default :
        return false;
        break;
    }
  }
  
  /**
   * 按比例计算合适的宽度
   * @param int $x 指定的缩略图宽度
   * @param int $y 指定的缩略图高度
   * @return array 包含调整后的缩略图宽度和高度
   */
  private function _dstsize($x,$y){
    list($srcwidth,$srcheight)=$this->localinfo;
    if(($srcwidth/$srcheight)<($x/$y)){
      $x=floor($y*$srcwidth/$srcheight);
    }else{
      $y=floor($x*$srcheight/$srcwidth);
    }
    $dstsize["width"]=$x;
    $dstsize["height"]=$y;
    return $dstsize;
  }


  /**
   * 获取最后一条错误信息
   * return string
   */
  function GetLastError(){
    return array_pop($this->error);
  }
  
  /**
   * 获取所有错误信息
   * return array
   */
  function GetAllError(){
    return $this->error;
  }
}
PHP 相关文章推荐
smtp邮件发送一例
Oct 09 PHP
require(),include(),require_once()和include_once()区别
Mar 27 PHP
PHPMailer发送HTML内容、带附件的邮件实例
Jul 01 PHP
php实现事件监听与触发的方法
Nov 21 PHP
thinkphp中session和cookie无效的解决方法
Dec 19 PHP
php可应用于面包屑导航的递归寻找家谱树实现方法
Feb 02 PHP
Yii框架参数化查询中IN查询只能查询一个的解决方法
May 20 PHP
搜索附近的人PHP实现代码
Feb 11 PHP
PHP信号处理机制的操作代码讲解
Apr 19 PHP
ThinkPHP 5.1 跨域配置方法
Oct 11 PHP
TP5框架使用QueryList采集框架爬小说操作示例
Mar 26 PHP
PHP实现文件上传与下载
Aug 28 PHP
PHP mkdir()无写权限的问题解决方法
Jun 19 #PHP
PHP获取文件的MD5值并判断是否被修改的例子
Jun 19 #PHP
PHP中strlen()和mb_strlen()的区别浅析
Jun 19 #PHP
php对包含html标签的字符串进行截取的函数分享
Jun 19 #PHP
php解决抢购秒杀抽奖等大流量并发入库导致的库存负数的问题
Jun 19 #PHP
PHP base64编码后解码乱码的解决办法
Jun 19 #PHP
PHP安全的URL字符串base64编码和解码
Jun 19 #PHP
You might like
十天学会php之第十天
2006/10/09 PHP
php获得文件扩展名三法
2006/11/25 PHP
解析php取整的几种方式
2013/06/25 PHP
php实现获取局域网所有用户的电脑IP和主机名、及mac地址完整实例
2014/07/18 PHP
一张表搞清楚php is_null、empty、isset的区别
2015/07/07 PHP
深入理解PHP JSON数组与对象
2016/07/19 PHP
PHP Post获取不到非表单数据的问题解决办法
2018/02/27 PHP
js判断当前浏览器类型,判断IE浏览器方法
2014/06/02 Javascript
灵活的理解JavaScript中的this指向
2016/02/25 Javascript
JS实现HTML表格排序功能
2016/08/05 Javascript
JS读写CSS样式的方法汇总
2016/08/16 Javascript
Bootstrap学习笔记之环境配置(1)
2016/12/07 Javascript
浅谈js-FCC算法Friendly Date Ranges(详解)
2017/04/10 Javascript
jQuery实现的弹幕效果完整实例
2017/09/06 jQuery
js经验分享 JavaScript反调试技巧
2018/03/10 Javascript
详解Vue.js自定义tipOnce指令用法实例
2018/12/19 Javascript
vue组件内部引入外部js文件的方法
2020/01/18 Javascript
微信小程序实现可长按移动控件
2020/11/01 Javascript
pytorch 调整某一维度数据顺序的方法
2018/12/08 Python
python 实现UTC时间加减的方法
2018/12/31 Python
pyqt5移动鼠标显示坐标的方法
2019/06/21 Python
基于Python的图像数据增强Data Augmentation解析
2019/08/13 Python
opencv-python 读取图像并转换颜色空间实例
2019/12/09 Python
用python3读取python2的pickle数据方式
2019/12/25 Python
在pycharm创建scrapy项目的实现步骤
2020/12/01 Python
纯css3无js实现的Android Logo(有简单动画)
2013/01/21 HTML / CSS
纽约家具、家居装饰和地毯店:ABC Carpet & Home
2017/06/21 全球购物
L’AGENCE官网:加州女装品牌
2018/06/03 全球购物
苹果台湾官网:Apple台湾
2019/01/05 全球购物
会计专业个人求职信范文
2014/01/08 职场文书
婚前协议书范本
2014/04/15 职场文书
校车安全责任书
2014/08/25 职场文书
大学生党员批评与自我批评
2014/09/28 职场文书
2014年民警工作总结
2014/11/25 职场文书
三方合作意向书范本
2015/05/09 职场文书
端午节将至,用Python爬取粽子数据并可视化,看看网友喜欢哪种粽子吧!
2021/06/11 Python