PHP生成自适应大小的缩略图类及使用方法分享


Posted in PHP onMay 06, 2014

把下面的代码直接复制,新建一个文件叫做 thumbnailimage.php  ,文件名最好不要用大写,把以下代码复制进去:

<?php
define ( 'MAX_IMG_SIZE', 100000 );
// Supported image types
define ( 'THUMB_JPEG', 'image/jpeg' );
define ( 'THUMB_PNG', 'image/png' );
define ( 'THUMB_GIF', 'image/gif' );
// Interlacing modes
define ( 'INTERLACE_OFF', 0 );
define ( 'INTERLACE_ON', 1 );
// Output modes
define ( 'STDOUT', '' );
// Empty constants
define ( 'NO_LOGO', '' );
define ( 'NO_LABEL', '' );
// Logo and label positioning
define ( 'POS_LEFT', 0 );
define ( 'POS_RIGHT', 1 );
define ( 'POS_CENTER', 2 );
define ( 'POS_TOP', 3 );
define ( 'POS_BOTTOM', 4 );
// Error messages
define ( 'E_001', 'File <b>%s</b> do not exist' );
define ( 'E_002', 'Failed reading image data from <b>%s</b>' );
define ( 'E_003', 'Cannot create the copy of <b>%s</b>' );
define ( 'E_004', 'Cannot copy the logo image' );
define ( 'E_005', 'Cannot create final image' );
// ****************************************************************************
// CLASS DEFINITION
// ****************************************************************************
class ThumbnailImage
{
// ****************************************************************************
// PUBLIC PROPERTIES
// ****************************************************************************
  var $src_file;  // source image file
  var $dest_file; // destination image file
  var $dest_type;  // destination image type
  var $interlace; // destination image interlacing mode
  var $jpeg_quality; // quality of resulting JPEG
  var $max_width; // maximal thumbnail width
  var $max_height; // maximal thumbnail height
  var $fit_to_max; // enlarge small images?
  var $logo; // array of logo parameters
  var $label; // array of label parameters
// ****************************************************************************
// CLASS CONSTRUCTOR
// ****************************************************************************
  /*
    Description:
      Defines default values for properties.
    Prototype:
      void ThumbImg ( string src_file = '' )
    Parameters:
      src_file - source image filename
  */
  function ThumbnailImage ( $src_file = '' )
  {
    $this->src_file = $src_file;
    $this->dest_file = STDOUT;
    $this->dest_type = THUMB_JPEG;
    $this->interlace = INTERLACE_OFF;
    $this->jpeg_quality = -1;
    $this->max_width = 100;
    $this->max_height = 90;
    $this->fit_to_max = FALSE;
    $this->logo['file'] = NO_LOGO;
    $this->logo['vert_pos'] = POS_TOP;
    $this->logo['horz_pos'] = POS_LEFT;
    $this->label['text'] = NO_LABEL;
    $this->label['vert_pos'] = POS_BOTTOM;
    $this->label['horz_pos'] = POS_RIGHT;
    $this->label['font'] = '';
    $this->label['size'] = 20;
    $this->label['color'] = '#000000';
    $this->label['angle'] = 0;
  }
// ****************************************************************************
// PRIVATE METHODS
// ****************************************************************************
  /*
    Description:
      Extracts decimal color components from hex color string.
    Prototype:
      array ParseColor ( string hex_color )
    Parameters:
      hex_color - color in '#rrggbb' format
    Return:
      Decimal values for red, green and blue color components.
  */
  function ParseColor ( $hex_color )
  {
    if ( strpos ( $hex_color, '#' ) === 0 )
      $hex_color = substr ( $hex_color, 1 );
    $r = hexdec ( substr ( $hex_color, 0, 2 ) );
    $g = hexdec ( substr ( $hex_color, 2, 2 ) );
    $b = hexdec ( substr ( $hex_color, 4, 2 ) );
    return array ( $r, $g, $b );
  }
  /*
    Description:
      Retrives image data as a string.
      Thanks to Luis Larrateguy for the idea of this function.
    Prototype:
      string GetImageStr ( string image_file )
    Parameters:
      image_file - filename of image
    Return:
      Image file contents string.
  */
  function GetImageStr ( $image_file )
  {
    if ( function_exists ( 'file_get_contents' ) )
    {
      $str = @file_get_contents ( $image_file );
      if ( ! $str )
      {
        $err = sprintf( E_002, $image_file );
        trigger_error( $err, E_USER_ERROR );
      }
      return $str;
    }
    $f = fopen ( $image_file, 'rb' );
    if ( ! $f )
    {
      $err = sprintf( E_002, $image_file );
      trigger_error( $err, E_USER_ERROR );
    }
    $fsz = @filesize ( $image_file );
    if ( ! $fsz )
      $fsz = MAX_IMG_SIZE;
    $str = fread ( $f, $fsz );
    fclose ( $f );
    return $str;
  }
  /*
    Description:
      Loads image from file.
    Prototype:
      resource LoadImage ( string image_file, int &image_width, int &image_height )
    Parameters:
      image_file - filename of image
      image_width - width of loaded image
      image_height - height of loaded image
    Return:
      Image identifier representing the image obtained from the given file.
  */
  function LoadImage ( $image_file, &$image_width, &$image_height )
  {
    $image_width = 0;
    $image_height = 0;
    $image_data = $this->GetImageStr( $image_file );
    $image = imagecreatefromstring ( $image_data );
    if ( ! $image )
    {
      $err = sprintf( E_003, $image_file );
      trigger_error( $err, E_USER_ERROR );
    }
    $image_width = imagesx ( $image );
    $image_height = imagesy ( $image );
    return $image;
  }
  /*
    Description:
      Calculates thumbnail image sizes from source image width and height.
    Prototype:
      array GetThumbSize ( int src_width, int src_height )
    Parameters:
      src_width - width of source image
      src_height - height of source image
    Return:
      An array with 2 elements. Index 0 contains the width of thumbnail image
      and index 1 contains the height.
  */
  function GetThumbSize ( $src_width, $src_height )
  {
    $max_width = $this->max_width;
    $max_height = $this->max_height;
    $x_ratio = $max_width / $src_width;
    $y_ratio = $max_height / $src_height;
    $is_small = ( $src_width <= $max_width && $src_height <= $max_height );
    if ( ! $this->fit_to_max && $is_small )
    {
      $dest_width = $src_width;
      $dest_height = $src_height;
    }
    elseif ( $x_ratio * $src_height < $max_height )
    {
      $dest_width = $max_width;
      $dest_height = ceil ( $x_ratio * $src_height );
    }
    else
    {
      $dest_width = ceil ( $y_ratio * $src_width );
      $dest_height = $max_height;
    }
    return array ( $dest_width, $dest_height );
  }
  /*
    Description:
      Adds logo image to thumbnail.
    Prototype:
      void AddLogo ( int thumb_width, int thumb_height, resource &thumb_img )
    Parameters:
      thumb_width - width of thumbnail image
      thumb_height - height of thumbnail image
      thumb_img - thumbnail image identifier
  */
  function AddLogo ( $thumb_width, $thumb_height, &$thumb_img )
  {
    extract ( $this->logo );
    $logo_image = $this->LoadImage ( $file, $logo_width, $logo_height );
    if ( $vert_pos == POS_CENTER )
      $y_pos = ceil ( $thumb_height / 2 - $logo_height / 2 );
    elseif ($vert_pos == POS_BOTTOM)
      $y_pos = $thumb_height - $logo_height;
    else
      $y_pos = 0;
    if ( $horz_pos == POS_CENTER )
      $x_pos = ceil ( $thumb_width / 2 - $logo_width / 2 );
    elseif ( $horz_pos == POS_RIGHT )
      $x_pos = $thumb_width - $logo_width;
    else
      $x_pos = 0;
    if ( ! imagecopy ( $thumb_img, $logo_image, $x_pos, $y_pos, 0, 0,
      $logo_width, $logo_height ) )
      trigger_error( E_004, E_USER_ERROR );
  }
  /*
    Description:
      Adds label text to thumbnail.
    Prototype:
      void AddLabel ( int thumb_width, int thumb_height, resource &thumb_img )
    Parameters:
      thumb_width - width of thumbnail image
      thumb_height - height of thumbnail image
      thumb_img - thumbnail image identifier
  */
  function AddLabel ( $thumb_width, $thumb_height, &$thumb_img )
  {
    extract ( $this->label );
    list( $r, $g, $b ) = $this->ParseColor ( $color );
    $color_id = imagecolorallocate ( $thumb_img, $r, $g, $b );
    $text_box = imagettfbbox ( $size, $angle, $font, $text );
    $text_width = $text_box [ 2 ] - $text_box [ 0 ];
    $text_height = abs ( $text_box [ 1 ] - $text_box [ 7 ] );
    if ( $vert_pos == POS_TOP )
      $y_pos = 5 + $text_height;
    elseif ( $vert_pos == POS_CENTER )
      $y_pos = ceil( $thumb_height / 2 - $text_height / 2 );
    elseif ( $vert_pos == POS_BOTTOM )
      $y_pos = $thumb_height - $text_height;
    if ( $horz_pos == POS_LEFT )
      $x_pos = 5;
    elseif ( $horz_pos == POS_CENTER )
      $x_pos = ceil( $thumb_width / 2 - $text_width / 2 );
    elseif ( $horz_pos == POS_RIGHT )
      $x_pos = $thumb_width - $text_width -5;
    imagettftext ( $thumb_img, $size, $angle, $x_pos, $y_pos,
      $color_id, $font, $text );
  }
  /*
    Description:
      Output thumbnail image into the browser.
    Prototype:
      void OutputThumbImage ( resource dest_image )
    Parameters:
      dest_img - thumbnail image identifier
  */
  function OutputThumbImage ( $dest_image )
  {
    imageinterlace ( $dest_image, $this->interlace );
    header ( 'Content-type: ' . $this->dest_type );
    if ( $this->dest_type == THUMB_JPEG )
      imagejpeg ( $dest_image, '', $this->jpeg_quality );
    elseif ( $this->dest_type == THUMB_GIF )
      imagegif($dest_image);
    elseif ( $this->dest_type == THUMB_PNG )
      imagepng ( $dest_image );
  }
  /*
    Description:
      Save thumbnail image into the disc file.
    Prototype:
      void SaveThumbImage ( string image_file, resource dest_image )
    Parameters:
      image_file - destination file name
      dest_img - thumbnail image identifier
  */
  function SaveThumbImage ( $image_file, $dest_image )
  {
    imageinterlace ( $dest_image, $this->interlace );
    if ( $this->dest_type == THUMB_JPEG )
      imagejpeg ( $dest_image, $this->dest_file, $this->jpeg_quality );
    elseif ( $this->dest_type == THUMB_GIF )
      imagegif ( $dest_image, $this->dest_file );
    elseif ( $this->dest_type == THUMB_PNG )
      imagepng ( $dest_image, $this->dest_file );
  }
// ****************************************************************************
// PUBLIC METHODS
// ****************************************************************************
  /*
    Description:
      Output thumbnail image into the browser or disc file according to the
      values of parameters.
    Prototype:
      void Output ( )
  */
  function Output()
  {
    $src_image = $this->LoadImage($this->src_file, $src_width, $src_height);
    $dest_size = $this->GetThumbSize($src_width, $src_height);
    $dest_width=$dest_size[0];
    $dest_height=$dest_size[1];
    $dest_image=imagecreatetruecolor($dest_width, $dest_height);
    if (!$dest_image)
      trigger_error(E_005, E_USER_ERROR);
    imagecopyresampled( $dest_image, $src_image, 0, 0, 0, 0,
      $dest_width, $dest_height, $src_width, $src_height );
    if ($this->logo['file'] != NO_LOGO)
      $this->AddLogo($dest_width, $dest_height, $dest_image);
    if ($this->label['text'] != NO_LABEL)
      $this->AddLabel($dest_width, $dest_height, $dest_image);
    if ($this->dest_file == STDOUT)
      $this->OutputThumbImage ( $dest_image );
    else
      $this->SaveThumbImage ( $this->dest_file, $dest_image );
    imagedestroy ( $src_image );
    imagedestroy ( $dest_image );
  }
} // End of class definition
?>

使用方法:
1、首先引用该php文件(不要告诉我不会)
2、调用代码
 $tis = new ThumbnailImage();
     $tis->src_file  = "这里写源文件的路径"
     $tis->dest_type = THUMB_JPEG;//生成图片的类型是 jpg
      $tis->dest_file = '这里写目标文件的路径';
     $tis->max_width = 120;//自适应大小,但是最大宽度为120
     $tis->max_height = 4000; //自适应大小,但是最大高度为4000
     $tis->Output();

代码关键在于 max_width 和max_height,填多少,就会帮你生成一个 差不多大小的文件,一般来说除非你的图片很有个性,譬如很长,否则缩略图生成的还是很体贴的。

PHP 相关文章推荐
PHP Zip解压 文件在线解压缩的函数代码
May 26 PHP
PHP统计目录下的文件总数及代码行数(去除注释及空行)
Jan 17 PHP
PHP实现时间轴函数代码
Oct 08 PHP
用php实现百度网盘图片直链的代码分享
Nov 01 PHP
php利用cookies实现购物车的方法
Dec 10 PHP
PHP实现获取FLV文件的时间
Feb 10 PHP
PHP数组和explode函数示例总结
May 08 PHP
PHP中时间加减函数strtotime用法分析
Apr 26 PHP
PHP简单获取随机数的常用方法小结
Jun 07 PHP
PHP7内核之Reference详解
Mar 14 PHP
PHP 图片合成、仿微信群头像的方法示例
Oct 25 PHP
php 命名空间(namespace)原理与用法实例小结
Nov 13 PHP
php 解压rar文件及zip文件的方法
May 05 #PHP
php中session过期时间设置及session回收机制介绍
May 05 #PHP
使用php语句将数据库*.sql文件导入数据库
May 05 #PHP
PHP判断是否有Get参数的方法
May 05 #PHP
php快递单号查询接口使用示例
May 05 #PHP
JS异常处理try..catch语句的作用和实例
May 05 #PHP
php生成短网址示例
May 05 #PHP
You might like
详解WordPress中用于合成数组的wp_parse_args()函数
2015/12/18 PHP
Zend Framework教程之Zend_Registry对象用法分析
2016/03/22 PHP
PHP创建word文档的方法(平台无关)
2016/03/29 PHP
php实现替换手机号中间数字为*号及隐藏IP最后几位的方法
2016/11/16 PHP
PHP面向对象五大原则之接口隔离原则(ISP)详解
2018/04/04 PHP
前端开发部分总结[兼容性、DOM操作、跨域等](持续更新)
2010/03/04 Javascript
40款非常有用的 jQuery 插件推荐(系列一)
2011/12/21 Javascript
node.js中的fs.readFileSync方法使用说明
2014/12/15 Javascript
深入理解JavaScript系列(27):设计模式之建造者模式详解
2015/03/03 Javascript
javascript实现别踩白块儿小游戏程序
2015/11/22 Javascript
jQuery Validate初步体验(二)
2015/12/12 Javascript
微信小程序开发之Tabbar实例详解
2017/01/09 Javascript
从零开始学习Node.js系列教程之设置HTTP头的方法示例
2017/04/13 Javascript
深入浅析Nodejs的Http模块
2017/06/20 NodeJs
Angular实现下载安装包的功能代码分享
2017/09/05 Javascript
axios 封装上传文件的请求方法
2018/09/26 Javascript
JavaScript使用ul中li标签实现删除效果
2019/04/15 Javascript
Vue封装的组件全局注册并引用
2019/07/24 Javascript
深入理解Vue keep-alive及实践总结
2019/08/21 Javascript
[49:35]KG vs SECRET 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
[01:11:11]Alliance vs RNG 2019国际邀请赛淘汰赛 败者组BO1 8.20.mp4
2020/07/19 DOTA
python更改已存在excel文件的方法
2018/05/03 Python
python批量赋值操作实例
2018/10/22 Python
Python3 安装PyQt5及exe打包图文教程
2019/01/08 Python
在keras中获取某一层上的feature map实例
2020/01/24 Python
基于Python正确读取资源文件
2020/09/14 Python
飞利浦比利时官方网站:Philips比利时
2016/08/24 全球购物
海信商城:海信电视、科龙空调、容声冰箱官方专卖
2017/02/07 全球购物
秸秆管理实施方案
2014/03/15 职场文书
排查整治工作方案
2014/06/09 职场文书
企业仓管员岗位职责
2014/06/15 职场文书
物流管理专业自荐信
2014/06/23 职场文书
2015应届毕业生自荐信范文
2015/03/05 职场文书
2015年秋季运动会加油稿
2015/07/22 职场文书
解决Goland 同一个package中函数互相调用的问题
2021/05/06 Golang
Python正则表达式中flags参数的实例详解
2022/04/01 Python