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 之入门篇
Dec 04 PHP
PHP下通过exec获得计算机的唯一标识[CPU,网卡 MAC地址]
Jun 09 PHP
使用PHP静态变量当缓存的方法
Nov 13 PHP
php数组中删除元素之重新索引的方法
Sep 16 PHP
PHP中防止SQL注入方法详解
Dec 25 PHP
PHP中使用register_shutdown_function函数截获fatal error示例
Apr 21 PHP
Zend Framework教程之资源(Resources)用法实例详解
Mar 14 PHP
CodeIgniter框架数据库基本操作示例
May 24 PHP
YII分模块加载路由的实现方法
Oct 01 PHP
CI(CodeIgniter)框架中URL特殊字符处理与SQL注入隐患分析
Feb 28 PHP
php写入文件不覆盖的实例讲解
Sep 17 PHP
thinkphp5 框架结合plupload实现图片批量上传功能示例
Apr 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
PHP4实际应用经验篇(1)
2006/10/09 PHP
修改了一个很不错的php验证码(支持中文)
2007/02/14 PHP
php 字符串函数收集
2010/03/29 PHP
php入门学习知识点七 PHP函数的基本应用
2011/07/14 PHP
基于PHP常用函数的用法详解
2013/05/10 PHP
PHP连接局域网MYSQL数据库的简单实例
2013/08/26 PHP
PHP Cookei记录用户历史浏览信息的代码
2016/02/03 PHP
PHP实现微信小程序人脸识别刷脸登录功能
2018/05/24 PHP
PHP+Ajax实现上传文件进度条动态显示进度功能
2018/06/04 PHP
Laravel统计一段时间间隔的数据方法
2019/10/09 PHP
响应鼠标变换表格背景或者颜色的代码
2009/03/30 Javascript
JSON 入门指南 想了解json的朋友可以看下
2009/08/26 Javascript
基于Asp.net与Javascript控制的日期控件
2010/05/22 Javascript
PHP abstract与interface之间的区别
2013/11/11 Javascript
JS实现的四级密码强度检测功能示例
2017/05/11 Javascript
javascript简单写的判断电话号码实例
2017/05/24 Javascript
JavaScript实现滑动导航栏效果
2017/08/30 Javascript
vuex actions传递多参数的处理方法
2018/09/18 Javascript
vue组件从开发到发布的实现步骤
2018/11/11 Javascript
详解用js代码触发dom事件的实现方案
2020/06/10 Javascript
Django的分页器实例(paginator)
2017/12/01 Python
Python如何爬取实时变化的WebSocket数据的方法
2019/03/09 Python
python模拟菜刀反弹shell绕过限制【推荐】
2019/06/25 Python
对Python函数设计规范详解
2019/07/19 Python
python线程信号量semaphore使用解析
2019/11/30 Python
使用python-Jenkins批量创建及修改jobs操作
2020/05/12 Python
Python多分支if语句的使用
2020/09/03 Python
canvas实现有递增动画的环形进度条的实现方法
2019/07/10 HTML / CSS
HTML5之SVG 2D入门7—SVG元素的重用与引用
2013/01/30 HTML / CSS
军训心得体会
2013/12/31 职场文书
我的大学生活职业生涯规划
2014/01/02 职场文书
低碳环保倡议书
2014/04/14 职场文书
交警作风整顿剖析材料
2014/10/11 职场文书
离婚协议书范本2014
2014/10/27 职场文书
MySql新手入门的基本操作汇总
2021/05/13 MySQL
pytorch DataLoader的num_workers参数与设置大小详解
2021/05/28 Python