Image_Tools
[ class tree: Image_Tools ] [ index: Image_Tools ] [ all elements ]

Source for file Thumbnail.php

Documentation is available at Thumbnail.php

  1. <?php
  2. /* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4 foldmethod=marker */
  3.  
  4. /**
  5.  * This is a driver file contains the Image_Tools_Thumbnail class
  6.  *
  7.  * PHP versions 4 and 5
  8.  *
  9.  * LICENSE:
  10.  *
  11.  * Copyright (c) 2006-2008 Ildar N. Shaimordanov <ildar-sh@mail.ru>
  12.  *
  13.  * This source file is subject to the BSD License license that is bundled
  14.  * with this package in the file LICENSE.txt.
  15.  * It is also available through the world-wide-web at this URL:
  16.  * http://www.opensource.org/licenses/bsd-license.php
  17.  * If you did not receive a copy of the license and are unable to
  18.  * obtain it through the world-wide-web, please send an email
  19.  * to pear-dev@list.php.net so we can send you a copy immediately.
  20.  *
  21.  * @category    Images
  22.  * @package     Image_Tools
  23.  * @author      Ildar N. Shaimordanov <ildar-sh@mail.ru>
  24.  * @copyright   Copyright (c) 2006-2008 Ildar N. Shaimordanov <ildar-sh@mail.ru>
  25.  * @license     http://www.opensource.org/licenses/bsd-license.php
  26.  *               BSD License
  27.  * @version     CVS: $Id: Thumbnail.php,v 1.8 2008/05/26 06:26:17 firman Exp $
  28.  * @since       File available since Release 0.4.0
  29.  */
  30.  
  31. /**
  32.  * Image_Tools
  33.  */
  34. require_once 'Image/Tools.php';
  35.  
  36. /**
  37.  * Image_Tools_Utils
  38.  */
  39. require_once 'Image/Tools/Utils.php';
  40.  
  41. // {{{ Constants
  42.  
  43. /**
  44. * Maximal scaling
  45. */
  46. define('IMAGE_TOOLS_THUMBNAIL_METHOD_SCALE_MAX'0);
  47.  
  48. /**
  49. * Minimal scaling
  50. */
  51. define('IMAGE_TOOLS_THUMBNAIL_METHOD_SCALE_MIN'1);
  52.  
  53. /**
  54. * Cropping of fragment
  55. */
  56. define('IMAGE_TOOLS_THUMBNAIL_METHOD_CROP',      2);
  57.  
  58. /**
  59. * Align constants
  60. */
  61. define('IMAGE_TOOLS_THUMBNAIL_ALIGN_CENTER'0);
  62. define('IMAGE_TOOLS_THUMBNAIL_ALIGN_LEFT',   -1);
  63. define('IMAGE_TOOLS_THUMBNAIL_ALIGN_RIGHT',  +1);
  64. define('IMAGE_TOOLS_THUMBNAIL_ALIGN_TOP',    -1);
  65. define('IMAGE_TOOLS_THUMBNAIL_ALIGN_BOTTOM'+1);
  66.  
  67. // }}}
  68. // {{{ Class: Image_Tools_Thumbnail
  69.  
  70. /**
  71.  * This class provide thumbnail creating tool for manipulating an image
  72.  *
  73.  * @category    Images
  74.  * @package     Image_Tools
  75.  * @author      Ildar N. Shaimordanov <ildar-sh@mail.ru>
  76.  * @copyright   Copyright (c) 2006-2008 Ildar N. Shaimordanov <ildar-sh@mail.ru>
  77.  * @license     http://www.opensource.org/licenses/bsd-license.php
  78.  *               BSD License
  79.  * @version     Release: 1.0.0RC1
  80.  * @since       Class available since Release 0.4.0
  81. */
  82. {
  83.     // {{{ Properties
  84.  
  85.     /**
  86.      * Thumbnail options:
  87.      * <pre>
  88.      * image   mixed  Destination image, a filename or an image string data or a GD image resource
  89.      * width   int    Width of thumbnail
  90.      * height  int    Height of thumbnail
  91.      * percent number Size of thumbnail per size of original image
  92.      * method  int    Method of thumbnail creating
  93.      * halign  int    Horizontal align
  94.      * valign  int    Vertical align
  95.      * </pre>
  96.      *
  97.      * @var     array 
  98.      * @access  protected
  99.      */
  100.     var $options = array(
  101.         'image'   => null,
  102.         'width'   => 100,
  103.         'height'  => 100,
  104.         'percent' => 0,
  105.         'method'  => IMAGE_TOOLS_THUMBNAIL_METHOD_SCALE_MAX,
  106.         'halign'  => IMAGE_TOOLS_THUMBNAIL_ALIGN_CENTER,
  107.         'valign'  => IMAGE_TOOLS_THUMBNAIL_ALIGN_CENTER,
  108.     );
  109.  
  110.     /**
  111.      * Available options for Image_Tools_Thumbnail
  112.      *
  113.      * @var     array 
  114.      * @access  protected
  115.      */
  116.     var $availableOptions = array(
  117.         'image'   => 'mixed',
  118.         'width'   => 'int',
  119.         'height'  => 'int',
  120.         'percent' => 'number',
  121.         'method'  => 'int',
  122.         'halign'  => 'int',
  123.         'valign'  => 'int',
  124.     );
  125.  
  126.     /**
  127.      * Image_Tools_Thumbnail API version.
  128.      *
  129.      * @var     string 
  130.      * @access  protected
  131.      */
  132.     var $version = '1.0';
  133.  
  134.     /**
  135.      * Image info.
  136.      *
  137.      * @var     resource 
  138.      * @access  protected
  139.      */
  140.     var $imageInfo = null;
  141.  
  142.     // }}}
  143.     // {{{ preRender()
  144.  
  145.     /**
  146.      * Function which called before render.
  147.      *
  148.      * @return  bool|PEAR_ErrorTRUE on success or PEAR_Error on failure.
  149.      * @access  protected
  150.      * @see     Image_Tools::createImage()
  151.      */
  152.     function preRender()
  153.     {
  154.         // Create the source image
  155.         $res Image_Tools::createImage($this->options['image']);
  156.         if PEAR::isError($res) ) {
  157.             return $res;
  158.         }
  159.  
  160.         $this->resultImage = $res;
  161.         $this->_init();
  162.     }
  163.     // }}}
  164.     // {{{ postRender()
  165.  
  166.     /**
  167.      * Function which called after render.
  168.      *
  169.      * @return  bool|PEAR_ErrorTRUE on success or PEAR_Error on failure.
  170.      * @access  protected
  171.      * @see render()
  172.      */
  173.     function postRender()
  174.     {
  175.         $this->_init();
  176.     }
  177.     // }}}
  178.     // {{{ render()
  179.  
  180.     /**
  181.      * Draw thumbnail result to resource.
  182.      *
  183.      * @return  bool|PEAR_ErrorTRUE on success or PEAR_Error on failure.
  184.      * @access  public
  185.      */
  186.     function render()
  187.     {
  188.         if (!Image_Tools::isGDImageResource($this->resultImage)) {
  189.             return PEAR::raiseError('Invalid image resource');
  190.         }
  191.  
  192.         // Estimate a rectangular portion of the source image and a size of the target image
  193.         if ($this->options['method'== IMAGE_TOOLS_THUMBNAIL_METHOD_CROP{
  194.             if $this->options['percent'{
  195.                 $W floor($this->options['percent'/ 100 * $this->imageInfo['width']);
  196.                 $H floor($this->options['percent'/ 100 * $this->imageInfo['height']);
  197.             else {
  198.                 $W $this->options['width'];
  199.                 $H $this->options['height'];
  200.             }
  201.  
  202.             $width $W;
  203.             $height $H;
  204.  
  205.             $Y $this->_coord('valign''height'$H);
  206.             $X $this->_coord('halign''width'$W);
  207.         else {
  208.             $W $this->imageInfo['width'];
  209.             $H $this->imageInfo['height'];
  210.  
  211.             $X = 0;
  212.             $Y = 0;
  213.  
  214.             if ($this->options['percent']{
  215.                 $width floor($this->options['percent'/ 100 * $W);
  216.                 $height floor($this->options['percent'/ 100 * $H);
  217.             else {
  218.                 $width $this->options['width'];
  219.                 $height $this->options['height'];
  220.  
  221.                 if ($this->options['method'== IMAGE_TOOLS_THUMBNAIL_METHOD_SCALE_MIN{
  222.                     $Ww $W $width;
  223.                     $Hh $H $height;
  224.                     if $Ww $Hh {
  225.                         $W floor($width $Hh);
  226.                         $X $this->_coord('halign''width'$W);
  227.                     else {
  228.                         $H floor($height $Ww);
  229.                         $Y $this->_coord('valign''height'$H);
  230.                     }
  231.                 else {
  232.                     if $H $W {
  233.                         $width floor($height $H $W);
  234.                     else {
  235.                         $height floor($width $W $H);
  236.                     }
  237.                 }
  238.             }
  239.         }
  240.  
  241.         // Create the target image
  242.         if (function_exists('imagecreatetruecolor')) {
  243.             $target imagecreatetruecolor($width$height);
  244.         else {
  245.             $target imagecreate($width$height);
  246.         }
  247.         if (!Image_Tools::isGDImageResource($target)) {
  248.             return PEAR::raiseError('Cannot initialize new GD image stream');
  249.         }
  250.  
  251.         // enable transparency if supported
  252.         if (Image_Tools_Utils::compareGDVersion('2.0.28''>=')) {
  253.             // imagealphablending() and imagesavealpha() requires GD 2.0.38
  254.             imagealphablending($targetfalse);
  255.             imagesavealpha($targettrue);
  256.         }
  257.  
  258.         // Copy the source image to the target image
  259.         if ($this->options['method'== IMAGE_TOOLS_THUMBNAIL_METHOD_CROP{
  260.             $result imagecopy($target$this->resultImage00$X$Y$W$H);
  261.         elseif (function_exists('imagecopyresampled')) {
  262.             $result imagecopyresampled($target$this->resultImage00$X$Y$width$height$W$H);
  263.         else {
  264.             $result imagecopyresized($target$this->resultImage00$X$Y$width$height$W$H);
  265.         }
  266.         if (!$result{
  267.             return PEAR::raiseError('Cannot resize image');
  268.         }
  269.  
  270.         // Free a memory from the source image and save the resulting thumbnail
  271.         imagedestroy($this->resultImage);
  272.         $this->resultImage = $target;
  273.  
  274.         return true;
  275.     }
  276.  
  277.     // }}}
  278.     // {{{ _init()
  279.  
  280.     /**
  281.      * Initialization function.
  282.      */
  283.     function _init({
  284.         $this->imageInfo = array(
  285.             'width'  => imagesx($this->resultImage),
  286.             'height' => imagesy($this->resultImage),
  287.         );
  288.     }
  289.  
  290.     // }}}
  291.     // {{{ _coord()
  292.  
  293.     /**
  294.      * Calculate the right coordinate depend on alignment.
  295.      *
  296.      * @param string $align Direction of alignment (halign or valign).
  297.      * @param string $param Parameter (width or height)
  298.      * @param integer $src Source value
  299.      *
  300.      * @return integer 
  301.      * @access private
  302.      */
  303.     function _coord($align$param$src)
  304.     {
  305.         if ($this->options[$alignIMAGE_TOOLS_THUMBNAIL_ALIGN_CENTER{
  306.             $result = 0;
  307.         elseif ($this->options[$alignIMAGE_TOOLS_THUMBNAIL_ALIGN_CENTER{
  308.             $result $this->imageInfo[$param$src;
  309.         else {
  310.             $result ($this->imageInfo[$param$src>> 1;
  311.         }
  312.         return $result;
  313.     }
  314.  
  315.     // }}}
  316.  
  317. }
  318.  
  319. // }}}
  320.  
  321. /*
  322.  * Local variables:
  323.  * mode: php
  324.  * tab-width: 4
  325.  * c-basic-offset: 4
  326.  * c-hanging-comment-ender-p: nil
  327.  * End:
  328.  */
  329. ?>

Documentation generated on Mon, 26 May 2008 06:30:12 -0400 by phpDocumentor 1.4.0. PEAR Logo Copyright © PHP Group 2004.