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 相关文章推荐
PHP4之COOKIE支持详解
Oct 09 PHP
解析php中如何调用用户自定义函数
Aug 06 PHP
php实现数组按指定KEY排序的方法
Mar 30 PHP
PHP中SSO Cookie登录分析和实现
Nov 06 PHP
yii使用activeFileField控件实现上传文件与图片的方法
Dec 28 PHP
ThinkPHP模板循环输出Volist标签用法实例详解
Mar 23 PHP
Yii实现显示静态页的方法
Apr 25 PHP
PHP中大括号'{}'用法实例总结
Feb 08 PHP
yii2局部关闭(开启)csrf的验证的实例代码
Jul 10 PHP
PHP基于双向链表与排序操作实现的会员排名功能示例
Dec 26 PHP
PHP convert_uudecode()函数讲解
Feb 14 PHP
PHP开启目录引索+fancyindex漂亮目录浏览带搜索功能
Sep 23 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
PHP5 安装方法
2007/01/15 PHP
php下使用SMTP发邮件的代码
2008/01/10 PHP
深入理解PHP之require/include顺序 推荐
2011/01/02 PHP
mysql数据库差异比较的PHP代码
2012/02/05 PHP
PHP开发工具ZendStudio下Xdebug工具使用说明详解
2013/11/11 PHP
Yii使用find findAll查找出指定字段的实现方法
2014/09/05 PHP
php处理多图上传压缩代码功能
2018/06/13 PHP
php 下 html5 XHR2 + FormData + File API 上传文件操作实例分析
2020/02/28 PHP
js带按钮的提示框可供选择示例代码
2013/09/17 Javascript
js 获取浏览器版本以此来调整CSS的样式
2014/06/03 Javascript
jQuery+CSS3实现树叶飘落特效
2015/02/01 Javascript
js实现改进的仿蓝色论坛导航菜单效果代码
2015/09/06 Javascript
JS版微信6.0分享接口用法分析
2016/10/13 Javascript
JavaScript实现省市联动过程中bug的解决方法
2017/12/04 Javascript
解决vue prop传值default属性如何使用,为何不生效的问题
2020/09/21 Javascript
vue-calendar-component 封装多日期选择组件的实例代码
2020/12/04 Vue.js
收藏整理的一些Python常用方法和技巧
2015/05/18 Python
python好玩的项目—色情图片识别代码分享
2017/11/07 Python
python pandas dataframe 按列或者按行合并的方法
2018/04/12 Python
详解将Django部署到Centos7全攻略
2018/09/26 Python
Python中 CSV格式清洗与转换的实例代码
2019/08/29 Python
如何解决django-celery启动后迅速关闭
2019/10/16 Python
Python中文分词库jieba,pkusegwg性能准确度比较
2020/02/11 Python
基于python requests selenium爬取excel vba过程解析
2020/08/12 Python
python对 MySQL 数据库进行增删改查的脚本
2020/10/22 Python
python 模拟登录B站的示例代码
2020/12/15 Python
HTML5 Canvas图像模糊完美解决办法
2018/02/06 HTML / CSS
Camille Jewelry官网:现代女性时尚首饰
2019/07/07 全球购物
澳大利亚当地社区首选的光学商店:1001 Optical
2019/08/24 全球购物
怎么写好自荐信
2013/10/30 职场文书
年度献血先进个人事迹材料
2014/02/14 职场文书
售后服务承诺书模板
2014/05/21 职场文书
2014年机关后勤工作总结
2014/12/16 职场文书
何玥事迹观后感
2015/06/16 职场文书
学生退学证明
2015/06/23 职场文书
解决Swagger2返回map复杂结构不能解析的问题
2021/07/02 Java/Android