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 access 数据连接与读取保存编辑数据的实现代码
May 12 PHP
PHP面向对象分析设计的61条军规小结
Jul 17 PHP
Session保存到数据库的php类分享
Oct 24 PHP
php数组函数序列之each() - 获取数组当前内部指针所指向元素的键名和键值,并将指针移到下一位
Oct 31 PHP
PHP中全局变量global和$GLOBALS[]的区别分析
Aug 06 PHP
php中使用redis队列操作实例代码
Feb 07 PHP
PHP中上传多个文件的表单设计例子
Nov 19 PHP
php实现概率性随机抽奖代码
Jan 02 PHP
Yii 2.0实现联表查询加搜索分页的方法示例
Aug 02 PHP
php 截取中英文混合字符串的方法
May 31 PHP
PHP扩展mcrypt实现的AES加密功能示例
Jan 29 PHP
PHP实现唤起微信支付功能
Feb 18 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
PHP 模拟登陆MSN并获得用户信息
2009/05/16 PHP
header中Content-Disposition的作用与使用方法
2012/06/13 PHP
php数据结构与算法(PHP描述) 查找与二分法查找
2012/06/21 PHP
PHP+ajax分页实例简析
2015/12/07 PHP
PHP7扩展开发教程之Hello World实现方法示例
2017/08/03 PHP
javascript中的变量是传值还是传址的?
2010/04/19 Javascript
javascript模拟枚举的简单实例
2014/03/06 Javascript
JS实现从表格中动态删除指定行的方法
2015/03/31 Javascript
谈谈我对JavaScript DOM事件的理解
2015/12/18 Javascript
JS创建对象几种不同方法详解
2016/03/01 Javascript
jQuery插件实现图片轮播特效
2016/06/16 Javascript
AngularJS学习第二篇 AngularJS依赖注入
2017/02/13 Javascript
angular.JS实现网页禁用调试、复制和剪切
2017/03/31 Javascript
JavaScript函数表达式详解及实例
2017/05/05 Javascript
js生成word中图片处理方法
2018/01/06 Javascript
vue实现点击当前标签高亮效果【推荐】
2018/06/22 Javascript
vue实现引入本地json的方法分析
2018/07/12 Javascript
浅谈Angularjs中不同类型的双向数据绑定
2018/07/16 Javascript
小程序关于请求同步的总结
2019/05/05 Javascript
vue element upload组件 file-list的动态绑定实现
2019/10/11 Javascript
使用vue打包进行云服务器上传的问题
2020/03/02 Javascript
Node.js API详解之 util模块用法实例分析
2020/05/09 Javascript
详解JavaScript作用域、作用域链和闭包的用法
2020/09/03 Javascript
python回调函数用法实例分析
2015/05/09 Python
Python数据预处理之数据规范化(归一化)示例
2019/01/08 Python
Python进阶:生成器 懒人版本的迭代器详解
2019/06/29 Python
django API 中接口的互相调用实例
2020/04/01 Python
Django如何使用redis作为缓存
2020/05/21 Python
Python函数参数分类原理详解
2020/05/28 Python
巧用CSS3的calc()宽度计算做响应模式布局的方法
2018/03/22 HTML / CSS
如何设定的weblogic的热启动模式(开发模式)与产品发布模式
2012/09/08 面试题
体育比赛口号
2014/06/09 职场文书
交警正风肃纪剖析材料
2014/10/29 职场文书
优秀工作者事迹材料
2014/12/26 职场文书
2016小学优秀教师先进事迹材料
2016/02/26 职场文书
医学会议开幕词
2016/03/03 职场文书