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 相关文章推荐
简单采集了yahoo的一些数据
Feb 14 PHP
php中强制下载文件的代码(解决了IE下中文文件名乱码问题)
May 09 PHP
sql注入与转义的php函数代码
Jun 17 PHP
解析yii数据库的增删查改
Jun 20 PHP
php内存缓存实现方法
Jan 24 PHP
Yii2使用自带的UploadedFile实现的文件上传
Jun 20 PHP
PHP htmlspecialchars()函数用法与实例讲解
Mar 08 PHP
浅析PHP 中move_uploaded_file 上传中文文件名失败
Apr 17 PHP
Yii2框架配置文件(Application属性)与调试技巧实例分析
May 27 PHP
Laravel 自动生成验证的实例讲解:login / logout
Oct 14 PHP
PHP实现抽奖功能实例代码
Jun 30 PHP
php中数组最简单的使用方法
Dec 27 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
咖啡风味 世界咖啡主要分布分布 咖啡的生长要求
2021/03/06 新手入门
第六节--访问属性和方法
2006/11/16 PHP
PHP 抓取网页图片并且另存为的实现代码
2010/03/24 PHP
Zend Framework实现具有基本功能的留言本(附demo源码下载)
2016/03/22 PHP
php 修改上传文件大小限制实例详解
2016/10/23 PHP
jQuery学习笔记之jQuery的DOM操作
2010/12/22 Javascript
js 实现 input type=&quot;file&quot; 文件上传示例代码
2013/08/07 Javascript
jQuery实现获取table表格第一列值的方法
2016/03/01 Javascript
JavaScript中用let语句声明作用域的用法讲解
2016/05/20 Javascript
JS提示:Uncaught SyntaxError: Unexpected token ILLEGAL错误的解决方法
2016/08/19 Javascript
NodeJS创建最简单的HTTP服务器
2017/05/15 NodeJs
Angular4.x通过路由守卫进行路由重定向实现根据条件跳转到相应的页面(推荐)
2018/05/10 Javascript
layui 优化button按钮和弹出框的方法
2018/08/15 Javascript
JavaScript 判断iPhone X Series机型的方法
2019/01/28 Javascript
JavaScript数据结构与算法之二叉树添加/删除节点操作示例
2019/03/01 Javascript
Javascript实现贪吃蛇小游戏(含详细注释)
2020/10/23 Javascript
微信小程序反编译的实现
2020/12/10 Javascript
Python中的ConfigParser模块使用详解
2015/05/04 Python
Python自定义线程类简单示例
2018/03/23 Python
Python图片转换成矩阵,矩阵数据转换成图片的实例
2018/07/02 Python
浅谈python str.format与制表符\t关于中文对齐的细节问题
2019/01/14 Python
使用python写的opencv实时监测和解析二维码和条形码
2019/08/14 Python
解决Pycharm 包已经下载,但是运行代码提示找不到模块的问题
2019/08/31 Python
解决python调用自己文件函数/执行函数找不到包问题
2020/06/01 Python
Python 通过爬虫实现GitHub网页的模拟登录的示例代码
2020/08/17 Python
Python实现钉钉/企业微信自动打卡的示例代码
2021/02/02 Python
Keras保存模型并载入模型继续训练的实现
2021/02/20 Python
Chain Reaction Cycles俄罗斯:世界上最大的在线自行车商店
2019/08/27 全球购物
《彩色世界》教学反思
2014/04/12 职场文书
党课心得体会范文
2014/09/09 职场文书
党的群众路线教育实践活动调研报告
2014/11/03 职场文书
2014年中班下学期工作总结
2014/12/11 职场文书
保险公司客户经理岗位职责
2015/04/09 职场文书
2016年党课培训学习心得体会
2016/01/07 职场文书
自愿离婚协议书范本2016
2016/03/18 职场文书
公司员工违法违章行为检讨书
2019/06/24 职场文书