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 相关文章推荐
PHP一些常用的正则表达式字符的一些转换
Jul 29 PHP
PHP调用MySQL的存储过程的实现代码
Aug 12 PHP
PHP 开发环境配置(测试开发环境)
Apr 28 PHP
linux下使用crontab实现定时PHP计划任务失败的原因分析
Jul 05 PHP
php Imagick获取图片RGB颜色值
Jul 28 PHP
PHP实现获取中英文首字母
Jun 19 PHP
ThinkPHP实现递归无级分类――代码少
Jul 29 PHP
PHP基于反射机制实现插件的可插拔设计详解
Nov 10 PHP
PHP输出图像imagegif、imagejpeg与imagepng函数用法分析
Nov 14 PHP
基于PHP实现栈数据结构和括号匹配算法示例
Aug 10 PHP
通过源码解析Laravel的依赖注入
Jan 22 PHP
php合并数组并保留键值的实现方法
Mar 12 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批量删除、清除UTF-8文件BOM头的代码实例
2014/04/14 PHP
php格式化电话号码的方法
2015/04/24 PHP
向fckeditor编辑器插入指定代码的方法
2007/05/25 Javascript
javascript setAttribute, getAttribute 在不同浏览器上的不同表现
2010/08/05 Javascript
js比较和逻辑运算符的介绍
2013/03/10 Javascript
Iframe实现跨浏览器自适应高度解决方法
2014/09/02 Javascript
jquery中push()的用法(数组添加元素)
2014/11/25 Javascript
AngularJS入门教程之Hello World!
2014/12/06 Javascript
javascript使用smipleChart实现简单图表
2015/01/02 Javascript
js面向对象之静态方法和静态属性实例分析
2015/01/10 Javascript
深入理解JavaScript系列(17):面向对象编程之概论详细介绍
2015/03/04 Javascript
javascript设计模式之对象工厂函数与构造函数详解
2015/07/30 Javascript
基于jQuery实现的向下滑动二级菜单效果代码
2015/08/31 Javascript
JQuery点击事件回到页面顶部效果的实现代码
2016/05/24 Javascript
webpack打包react项目的实现方法
2018/06/21 Javascript
解决select2在bootstrap modal中不能正常使用的问题
2018/08/09 Javascript
Node.js中的不安全跳转如何防御详解
2018/10/21 Javascript
浅谈vue加载优化策略
2019/03/19 Javascript
vue element-ui table组件动态生成表头和数据并修改单元格格式 父子组件通信
2019/08/15 Javascript
layui自定义验证,用ajax查询后台是否有重复数据,form.verify的例子
2019/09/06 Javascript
详解利用eventemitter2实现Vue组件通信
2019/11/04 Javascript
webpack DllPlugin xxx is not defined解决办法
2019/12/13 Javascript
npx create-react-app xxx创建项目报错的解决办法
2020/02/17 Javascript
如何用JS模拟实现数组的map方法
2020/07/30 Javascript
使用Python脚本将Bing的每日图片作为桌面的教程
2015/05/04 Python
pygame播放音乐的方法
2015/05/19 Python
Python 统计字数的思路详解
2018/05/08 Python
使用python搭建服务器并实现Android端与之通信的方法
2019/06/28 Python
浅谈Python线程的同步互斥与死锁
2020/03/22 Python
python使用pymongo与MongoDB基本交互操作示例
2020/04/09 Python
PPP协议组成及简述协议协商的基本过程
2015/05/28 面试题
Vector, ArrayList, HashTable, HashMap哪些是线程安全的,哪些不是
2015/10/12 面试题
若干个Java基础面试题
2015/05/19 面试题
js正则匹配markdown里的图片标签的实现
2021/03/24 Javascript
2014年图书管理员工作总结
2014/12/01 职场文书
安全保证书格式
2015/02/28 职场文书