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 相关文章推荐
模仿OSO的论坛(三)
Oct 09 PHP
解析PayPal支付接口的PHP开发方式
Nov 28 PHP
php设计模式 Composite (组合模式)
Jun 26 PHP
codeigniter自带数据库类使用方法说明
Mar 25 PHP
dedecms中使用php语句指南
Nov 13 PHP
php中getservbyport与getservbyname函数用法实例
Nov 18 PHP
thinkphp中空模板与空模块的用法实例
Nov 26 PHP
php的常量和变量实例详解
Jun 27 PHP
PHP数组去重的更快实现方式分析
May 09 PHP
详解php协程知识点
Sep 21 PHP
PHP递归统计系统中代码行数
Sep 19 PHP
Laravel获取当前请求的控制器和方法以及中间件的例子
Oct 11 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
写一个用户在线显示的程序
2006/10/09 PHP
PHP命令行执行整合pathinfo模拟定时任务实例
2016/08/12 PHP
php源码的使用方法讲解
2019/09/26 PHP
asp.net和php的区别点总结
2019/10/10 PHP
php使用fputcsv实现大数据的导出操作详解
2020/02/27 PHP
nodejs 实现模拟form表单上传文件
2014/07/14 NodeJs
js遍历子节点子元素附属性及方法
2014/08/19 Javascript
jQuery插件boxScroll实现图片轮播特效
2015/07/14 Javascript
jQuery formValidator表单验证
2016/01/07 Javascript
JS简单生成两个数字之间随机数的方法
2016/08/03 Javascript
详解如何快速配置webpack多入口脚手架
2018/12/28 Javascript
d3.js实现图形拖拽
2019/12/19 Javascript
Vue 数据响应式相关总结
2021/01/28 Vue.js
[01:06:32]DOTA2上海特级锦标赛D组资格赛#1 EG VS VP第一局
2016/02/28 DOTA
[28:05]完美世界DOTA2联赛循环赛Inki vs DeMonsTer 第一场 10月30日
2020/10/31 DOTA
python脚本实现查找webshell的方法
2014/07/31 Python
python中迭代器(iterator)用法实例分析
2015/04/29 Python
ubuntu系统下使用pm2设置nodejs开机自启动的方法
2018/05/12 NodeJs
Django 创建新App及其常用命令的实现方法
2019/08/04 Python
python3 selenium自动化 下拉框定位的例子
2019/08/23 Python
python 使用opencv 把视频分割成图片示例
2019/12/12 Python
PyQt5 如何让界面和逻辑分离的方法
2020/03/24 Python
python实现输入三角形边长自动作图求面积案例
2020/04/12 Python
Python定时从Mysql提取数据存入Redis的实现
2020/05/03 Python
python创建文本文件的简单方法
2020/08/30 Python
HTML5之SVG 2D入门13—svg对决canvas及长处和适用场景分析
2013/01/30 HTML / CSS
Otticanet澳大利亚:最顶尖的世界名牌眼镜, 能得到打折季的价格
2018/08/23 全球购物
指针和引用有什么区别
2013/01/13 面试题
vue 中 get / delete 传递数组参数方法
2021/03/23 Vue.js
实习自我评价怎么写
2013/12/02 职场文书
教学大赛获奖感言
2014/01/15 职场文书
违反学校规定检讨书
2014/01/18 职场文书
网络编辑岗位职责
2014/03/18 职场文书
财产公证书
2014/04/10 职场文书
Python编程编写完善的命令行工具
2021/09/15 Python
MongoDB数据库部署环境准备及使用介绍
2022/03/21 MongoDB