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 相关文章推荐
JAVA/JSP学习系列之二
Oct 09 PHP
PHP学习之数组的定义和填充
Apr 17 PHP
fleaphp rolesNameField bug解决方法
Apr 23 PHP
php获取远程图片的两种 CURL方式和sockets方式获取远程图片
Nov 07 PHP
PHP数组无限分级数据的层级化处理代码
Dec 29 PHP
ThinkPHP 3.2 版本升级了哪些内容
Mar 05 PHP
CI框架使用composer安装的依赖包步骤与方法分析
Nov 21 PHP
thinkphp下MySQL数据库读写分离代码剖析
Apr 18 PHP
PHP保存Base64图片base64_decode的问题整理
Nov 04 PHP
php查看一个变量的占用内存的实例代码
Mar 29 PHP
PHP 命名空间和自动加载原理与用法实例分析
Apr 29 PHP
PHP实现递归的三种方法
Jul 04 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基础知识回顾
2012/08/16 PHP
php使用高斯算法实现图片的模糊处理功能示例
2016/11/11 PHP
php实现文件与16进制相互转换的方法示例
2017/02/16 PHP
thinkPHP5.0框架配置格式、加载解析与读取方法
2017/03/17 PHP
PHP封装的分页类与简单用法示例
2019/02/25 PHP
javascript下给元素添加事件的方法与代码
2007/08/13 Javascript
超级简单的jquery操作表格方法
2014/12/15 Javascript
JavaScript如何获取数组最大值和最小值
2015/11/18 Javascript
浅谈JavaScript的全局变量与局部变量
2016/06/10 Javascript
js实现类bootstrap模态框动画
2017/02/07 Javascript
Vue键盘事件用法总结
2017/04/18 Javascript
Ionic2调用本地SQlite实例
2017/04/22 Javascript
详解nodejs的express如何自动生成项目框架
2017/07/12 NodeJs
jQuery实现的点击标题文字切换字体效果示例【测试可用】
2018/04/26 jQuery
浅析JS中什么是自定义react数据验证组件
2018/10/19 Javascript
JS html事件冒泡和事件捕获操作示例
2019/05/01 Javascript
javascript事件监听与事件委托实例详解
2019/08/16 Javascript
举例讲解Python中is和id的用法
2015/04/03 Python
python实现批量解析邮件并下载附件
2018/06/19 Python
python 按不同维度求和,最值,均值的实例
2018/06/28 Python
django用户登录验证的完整示例代码
2019/07/21 Python
Python qrcode 生成一个二维码的实例详解
2020/02/12 Python
TensorFlow2.1.0安装过程中setuptools、wrapt等相关错误指南
2020/04/08 Python
Django实现后台上传并显示图片功能
2020/05/29 Python
50道外企软件测试面试题
2014/08/18 面试题
毕业生求职推荐信
2013/11/04 职场文书
计算机通信专业推荐信
2014/02/22 职场文书
餐饮营销方案
2014/02/23 职场文书
治安消防安全责任书
2014/07/23 职场文书
弄虚作假心得体会
2014/09/10 职场文书
村干部群众路线教育活动对照检查材料
2014/10/01 职场文书
员工年度工作总结2015
2015/05/18 职场文书
2015年网络舆情工作总结
2015/07/24 职场文书
JavaScript中isPrototypeOf函数
2021/11/07 Javascript
Nginx虚拟主机的配置步骤过程全解
2022/03/31 Servers
全网非常详细的pytest配置文件
2022/07/15 Python