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 中的批处理的实现
Jun 14 PHP
用来给图片加水印的PHP类
Apr 09 PHP
php文件操作实例代码
May 10 PHP
PHP 万年历实现代码
Oct 18 PHP
php中如何防止表单的重复提交
Aug 02 PHP
php curl 获取https请求的2种方法
Apr 27 PHP
jquery获取多个checkbox的值异步提交给php的方法
Jun 24 PHP
PHP封装的数据库保存session功能类
Jul 11 PHP
php  PATH_SEPARATOR判断当前服务器系统类型实例
Oct 28 PHP
浅谈php处理后端&amp;接口访问超时的解决方法
Oct 29 PHP
php读取和保存base64编码的图片内容
Apr 22 PHP
使用PHP反射机制来构造&quot;CREATE TABLE&quot;的sql语句
Mar 21 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+DBM的同学录程序(4)
2006/10/09 PHP
缓存技术详谈―php
2006/12/14 PHP
PHP新手NOTICE错误常见解决方法
2011/12/07 PHP
php通过array_push()函数添加多个变量到数组末尾的方法
2015/03/18 PHP
php在windows环境下获得cpu内存实时使用率(推荐)
2018/02/08 PHP
javascript下利用arguments实现string.format函数
2010/08/24 Javascript
javascript 运算数的求值顺序
2011/08/23 Javascript
JavaScript中数组的排序、乱序和搜索实现代码
2011/11/30 Javascript
jquery得到font-size属性值实现代码
2013/09/30 Javascript
JavaScript设计模式之外观模式介绍
2014/12/28 Javascript
JavaScript将XML转成JSON的方法
2015/03/12 Javascript
JS实现漂亮的淡蓝色滑动门效果代码
2015/09/23 Javascript
js中使用使用原型(prototype)定义方法的好处详解
2016/07/04 Javascript
用jQuery.ajaxSetup实现对请求和响应数据的过滤
2016/12/20 Javascript
js实现文字跑马灯效果
2017/02/23 Javascript
Webpack优化配置缩小文件搜索范围
2017/12/25 Javascript
基于Vue的SPA动态修改页面title的方法(推荐)
2018/01/02 Javascript
小程序实现左滑删除效果
2019/07/25 Javascript
使用Python中PDB模块中的命令来调试Python代码的教程
2015/03/30 Python
python插入排序算法实例分析
2015/07/03 Python
利用python爬取散文网的文章实例教程
2017/06/18 Python
Python实现pdf文档转txt的方法示例
2018/01/19 Python
Django中使用celery完成异步任务的示例代码
2018/01/23 Python
python2.7实现邮件发送功能
2018/12/12 Python
用Pytorch训练CNN(数据集MNIST,使用GPU的方法)
2019/08/19 Python
python实现数据清洗(缺失值与异常值处理)
2019/12/02 Python
pycharm不能运行.py文件的解决方法
2020/02/12 Python
俄罗斯苹果优质经销商商店:iPort
2020/05/27 全球购物
采购部部门职责
2013/12/15 职场文书
经理秘书找工作求职信
2013/12/19 职场文书
护士试用期自我鉴定
2014/02/08 职场文书
我的梦想演讲稿1000字
2014/08/21 职场文书
2014幼儿园保育员工作总结
2014/11/10 职场文书
2014年校长工作总结
2014/12/11 职场文书
解读MySQL的客户端和服务端协议
2021/05/10 MySQL
canvas 中如何实现物体的框选
2022/08/05 Javascript