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文本操作类
Nov 25 PHP
PHP 地址栏信息的获取代码
Jan 07 PHP
Zend Studio去除编辑器的语法警告设置方法
Oct 24 PHP
基于php-fpm的配置详解
Jun 03 PHP
php统计文章排行示例
Mar 04 PHP
phpMyAdmin自动登录和取消自动登录的配置方法
May 12 PHP
discuz目录文件资料汇总
Dec 30 PHP
浅谈PHP中单引号和双引号到底有啥区别呢?
Mar 04 PHP
编写PHP脚本清除WordPress头部冗余代码的方法讲解
Mar 01 PHP
PHP获取IP地址所在地信息的实例(使用纯真IP数据库qqwry.dat)
Nov 15 PHP
PHP实现的redis主从数据库状态检测功能示例
Jul 20 PHP
Laravel统一错误处理为JSON的方法介绍
Oct 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
使用 eAccelerator加速PHP代码的方法
2007/09/30 PHP
纯php生成随机密码
2015/10/30 PHP
PHP数组函数知识汇总
2016/05/12 PHP
css把超出的部分显示为省略号的方法兼容火狐
2008/07/23 Javascript
基于jquery的15款幻灯片插件
2011/04/10 Javascript
实现51Map地图接口(示例代码)
2013/11/22 Javascript
jQuery实现鼠标经过图片预览大图效果
2014/04/10 Javascript
jQuery+css实现百度百科的页面导航效果
2014/12/16 Javascript
jQuery实现长按按钮触发事件的方法
2015/02/02 Javascript
JavaScript原生对象常用方法总结(推荐)
2016/05/13 Javascript
使用jQuery调用XML实现无刷新即时聊天
2016/08/07 Javascript
微信小程序 图片宽高自适应详解
2017/05/11 Javascript
vue-prop父组件向子组件进行传值的方法
2018/03/01 Javascript
angular6的table组件开发的实现示例
2018/12/26 Javascript
jquery实现二级导航下拉菜单效果实例
2019/05/14 jQuery
js事件触发操作实例分析
2019/06/21 Javascript
JS实现的定时器展示简单秒表、页面弹框及跳转操作完整示例
2020/01/26 Javascript
javascript设计模式 ? 适配器模式原理与应用实例分析
2020/04/13 Javascript
如何基于filter实现网站整体变灰功能
2020/04/17 Javascript
Element中Slider滑块的具体使用
2020/07/29 Javascript
Python常用随机数与随机字符串方法实例
2015/04/09 Python
基于Python的关键字监控及告警
2017/07/06 Python
Python 中字符串拼接的多种方法
2018/07/30 Python
Python实现Dijkstra算法
2018/10/17 Python
pycharm如何实现跨目录调用文件
2020/02/28 Python
使用ITK-SNAP进行抠图操作并保存mask的实例
2020/07/01 Python
python使用布隆过滤器的实现示例
2020/08/20 Python
css3 给页面加个半圆形导航条主要利用旋转和倾斜样式
2014/02/10 HTML / CSS
Woolworth官网:澳洲第一大超市
2017/06/25 全球购物
DataReader和DataSet的异同
2014/12/31 面试题
Linux的主要特性
2016/09/03 面试题
企业法人代表授权委托书
2014/10/02 职场文书
永远是春天观后感
2015/06/12 职场文书
让人感觉高大上的讲话稿怎么写?
2019/07/08 职场文书
2019年幼儿园家长接送责任书
2019/10/29 职场文书