big-moving.ru/api/soft/Thumbnail/ImageThumbnailer_1.0.php

225 lines
4.9 KiB
PHP
Executable File

<?php
/**
* Thumbnail Image Creator
*
* @name ImageThumbnailer
* @version 1.0
* @author Shay Anderson 9.12
* @copyright Copyright 2012 ShayAnderson.com <http://www.shayanderson.com>
* @license MIT License <http://www.opensource.org/licenses/mit-license.php>
* @link http://www.shayanderson.com/php/simple-php-thumbnail-image-class.htm
*/
class ImageThumbnailer
{
/**
* Supported image types
*
* @staticvar array
*/
public static $__image_types = array(
0x1 => 'gif',
0x2 => 'jpeg',
0x3 => 'png',
0x6 => 'bmp'
);
/**
* Allowed image types/file extensions (separate multiple values with pipe '|')
*
* @var string
*/
public $allowed_image_types = 'bmp|gif|jpg|jpeg|png';
/**
* JPEG compression level (0-100, 0 is the most compression)
*
* @var int
*/
public $compression_jpeg = 100;
/**
* PNG compresssion level (0-8, 8 is the most compression, 0 is none)
*
* @var int
*/
public $compression_png = 8;
/**
* Max dimesion (this can control both width and height)
*
* @var int
*/
public $max_dimension = 200;
/**
* Max height dimension (this will override max_dimension property)
*
* @var int
*/
public $max_height = 0;
/**
* Max width dimension (this will override max_dimension property)
*
* @var int
*/
public $max_width = 0;
/**
* Use true color flag
*
* @var bool
*/
public $use_true_color = true;
/**
* Init
*/
public function __construct()
{
if(!function_exists('getimagesize'))
{ // check for GD library
trigger_error(__CLASS__ . ' requires the GD library', E_USER_ERROR);
}
}
/**
* Draw/create thumbnail image
*
* @param string $image_path (source image path)
* @param string $target_path (optional, will save image instead of output if set)
* @return void
*/
public function draw($image_path, $target_path = null)
{
if(!file_exists($image_path)) // check if image exists
{
trigger_error('Image "' . $image_path . '" does not exist', E_USER_ERROR);
}
if(!preg_match('/\.(' . $this->allowed_image_types . ')$/i', $image_path)) // check valid image type
{
trigger_error('Invalid image type for image "' . $image_path . '"', E_USER_ERROR);
}
$img_info = getimagesize($image_path); // set image info
list($img_w, $img_h, $img_type) = $img_info;
$img_mine = null;
if($img_type > 0 && !isset(self::$__image_types[$img_type])) // check valid image type code
{
trigger_error('Invalid image type for image "' . $image_path . '" (image type code: ' . $img_type . ')');
}
if(isset($img_info['mime']))
{
$img_mine = $img_info['mime'];
}
else
{
trigger_error('Invalid iamge MIME type for image "' . $image_path . '"', E_USER_ERROR);
}
// override max dimesion
$this->max_dimension = $this->max_height > 0 ? $this->max_height : $this->max_dimension;
$this->max_dimension = $this->max_width > 0 ? $this->max_width : $this->max_dimension;
// set new dimensions
$img_new_w = $img_new_h = 0;
if($this->max_width > 0 && $img_w > $this->max_width) // resize on width
{
$img_new_w = $this->max_width;
$img_new_h = round($img_h * ($img_new_w / $img_w));
}
else if($this->max_height > 0 && $img_h > $this->max_height) // resize on height
{
$img_new_h = $this->max_height;
$img_new_w = round($img_w * ($img_new_h / $img_h));
}
else if($img_w > $this->max_dimension || $img_h > $this->max_dimension) // resize on max dim
{
$img_new_w = $this->max_dimension;
$img_new_h = $this->max_dimension;
if($img_w > $img_h)
{
$img_new_h = round($img_h * ($img_new_w / $img_w));
}
else
{
$img_new_w = round($img_w * ($img_new_h / $img_h));
}
}
$fc = $this->use_true_color ? 'imagecreatetruecolor' : 'imagecreate'; // use truecolor for jpeg
if($img_new_w > 0 && $img_new_h > 0) // check if resize needed
{
$img_new = $fc($img_new_w, $img_new_h);
$f = 'imagecreatefrom' . self::$__image_types[$img_type];
$img = $f($image_path);
imagecopyresampled($img_new, $img, 0, 0, 0, 0, $img_new_w, $img_new_h, $img_w, $img_h);
imagedestroy($img);
}
else
{
$img_new = $fc($img_w, $img_h);
$f = 'imagecreatefrom' . self::$__image_types[$img_type];
$img_new = $f($image_path);
}
$f = 'image' . self::$__image_types[$img_type];
if(strlen($target_path) < 1) // output image
{
header('Content-type: ' . $img_mine);
}
switch($img_type)
{
case 0x2:
$f($img_new, $target_path, $this->compression_jpeg);
break;
case 0x3:
$f($img_new, $target_path, $this->compression_png);
break;
default:
$f($img_new, $target_path);
break;
}
imagedestroy($img_new);
}
}
/*
// include class
require_once './ImageThumbnailer.php';
// set object
$img = new ImageThumbnailer;
// set max dimension
$img->max_dimension = 300;
// output image in browser
$img->draw('./test.png');
// save thumbnail image as file
$img->draw('./test.png', './test_thumb.png');
*/