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 相关文章推荐
无限级别菜单的实现
Oct 09 PHP
destoon实现调用热门关键字的方法
Jul 15 PHP
ThinkPHP实现带验证码的文件上传功能实例
Nov 01 PHP
PHP callback函数使用方法和注意事项
Jan 23 PHP
php实现用已经过去多长时间的方式显示时间
Jun 05 PHP
使用PHPCMS搭建wap手机网站
Sep 20 PHP
PHP 实现的将图片转换为TXT
Oct 21 PHP
Laravel框架中VerifyCsrfToken报错问题的解决
Aug 30 PHP
PHP实现生成模糊图片的方法示例
Dec 21 PHP
php实现QQ小程序发送模板消息功能
Sep 18 PHP
PHP发送邮件确认验证注册功能示例【修改别人邮件类】
Nov 09 PHP
PHP获取php,mysql,apche的版本信息及更多服务器信息
Mar 09 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捕获Fatal error错误的方法
2014/06/11 PHP
Zend Framework动作控制器用法示例
2016/12/09 PHP
PHP实现限制IP访问的方法
2017/04/20 PHP
PHP自定义函数实现数组比较功能示例
2017/10/19 PHP
JavaScript词法作用域与调用对象深入理解
2012/11/29 Javascript
通过jquery 获取URL参数并进行转码
2014/08/18 Javascript
js对象基础实例分析
2015/01/13 Javascript
JavaScript实现的伸展收缩型菜单代码
2015/10/14 Javascript
JavaScript使用DeviceOne开发实战(二) 生成调试安装包
2015/12/01 Javascript
jQuery实现的省市县三级联动菜单效果完整实例
2016/08/01 Javascript
利用Angularjs和原生JS分别实现动态效果的输入框
2016/09/01 Javascript
javascript数组对象常用api函数小结(连接,插入,删除,反转,排序等)
2016/09/20 Javascript
Angular 常用指令实例总结整理
2016/12/13 Javascript
Bootstrap弹出框modal上层的输入框不能获得焦点问题的解决方法
2016/12/13 Javascript
Vue.js实战之组件之间的数据传递
2017/04/01 Javascript
jQuery实现点击关注和取消功能
2017/07/03 jQuery
javascript定时器取消定时器及优化方法
2017/07/08 Javascript
js判断数组是否包含某个字符串变量的实例
2017/11/24 Javascript
js实现打字小游戏
2019/12/17 Javascript
Django日志模块logging的配置详解
2017/02/14 Python
Python使用Django实现博客系统完整版
2020/09/29 Python
pyinstaller打包多个py文件和去除cmd黑框的方法
2019/06/21 Python
python使用装饰器作日志处理的方法
2019/07/11 Python
Canvas 文字碰撞检测并抽稀的方法
2019/05/27 HTML / CSS
英智兴达软件测试笔试题
2016/10/12 面试题
监理资料员岗位职责
2014/01/03 职场文书
《沉香救母》教学反思
2014/04/19 职场文书
《赶海》教学反思
2014/04/20 职场文书
校园演讲稿汇总
2014/05/21 职场文书
声乐专业大学生职业生涯规划书:理想的未来需要自己去打造
2014/09/20 职场文书
小学安全工作总结2015
2015/05/18 职场文书
法制主题班会教案
2015/08/13 职场文书
优秀党员主要事迹材料
2015/11/04 职场文书
python实现语音常用度量方法的代码详解
2021/05/25 Python
springboot利用redis、Redisson处理并发问题的操作
2021/06/18 Java/Android
Python多线程 Queue 模块常见用法
2021/07/04 Python