MY_Image_lib - El Forum - 04-17-2012
[eluser]bralens[/eluser]
Hello.
So i was searching for thumbnail creating library, function etc for CI, but only found functions where photo fits in to passed dimensions, but i need where photo fills passed dimensions. So here is it.
Code: <?php if (! defined('BASEPATH')) exit('No direct script access allowed');
/**
* MY_Image_lib
*
* Class to extend CI native Image manipulation library.
*
* @package CodeIgniter
* @subpackage Image_lib
* @author Roberts Guļāns
*/
class MY_Image_lib extends CI_Image_lib
{
// default back up
var $def_height = '100';
var $def_width = '100';
public function __construct($props = array())
{
parent::__construct($props);
log_message('debug', "MY Image Lib Class Initialized");
}
/**
* Resize photo to fill dimension
*
* @access public
* @return bool
*/
public function fill()
{
$image_sizes = $this->_get_image_size($this->full_src_path);
// get dimension ratios
$photo_ratio = $image_sizes['width'] / $image_sizes['height'];
$dimension_ratio = $this->def_width / $this->def_height;
// if ratios are equal
if($photo_ratio == $dimension_ratio)
{
// can use resize to fill all area
return $this->resize();
}
else
{
// if photo is more extended in width than area needed to fill
if($photo_ratio < $dimension_ratio)
{
// on top and bottom photo will be beyond area borders
$this->width = $this->def_width;
$this->height = $this->def_width / $photo_ratio;
}
else
{
// on the sides photo will be beyond area borders
$this->height = $this->def_height;
$this->width = $this->def_height * $photo_ratio;
}
return $this->resize();
}
}
/**
* Crop dead center
*
* @access public
* @return bool
*/
public function center_crop()
{
$image_sizes = $this->_get_image_size($this->full_src_path);
$this->x_axis = ( $image_sizes['width'] - $this->def_width ) / 2;
$this->y_axis = ( $image_sizes['height'] - $this->def_height ) / 2;
$this->width = $this->def_width;
$this->height = $this->def_height;
return $this->crop();
}
/**
* Create thumbnail using fill and center_crop functions
*
* @access public
* @param string $file full/path/to/photo.ext
* @param int|string $width
* @param int|string $height
* @return bool
*/
public function thumbnail($width = '', $height = '')
{
if($width != '' && $height != '')
{
$this->def_width = $width;
$this->def_height = $height;
}
elseif($width != '' && $height == '')
{
// if passed width but dont have height
// make it square
$this->def_width = $width;
$this->def_height = $width;
}
if($this->fill())
{
$this->_my_clear(FALSE);
if($this->center_crop())
{
return TRUE;
}
}
return FALSE;
}
/**
* Clear Image_lib variables and set new ones
*
* @access public
* @param bool $create_thumb create new file or not
*/
private function _my_clear($create_thumb = TRUE)
{
$config['image_library'] = $this->image_library;
$config['source_image'] = $this->full_dst_path;
$config['width'] = $this->def_width;
$config['height'] = $this->def_height;
$config['create_thumb'] = $create_thumb;
$this->clear();
$this->initialize($config);
}
/**
* Get the image sizes for an image
* @access public
* @param string $image
* @return array
*/
public function _get_image_size($image)
{
$image_data = getimagesize($image);
$image_data['width'] = $image_data[0];
$image_data['height'] = $image_data[1];
return $image_data;
}
}
To initialize
must set two extra lines because in initialize function $width and $height values can be changed to fit in to dimensions, but we need original $width and $height.
Code: $config['def_width'] = $config['width'];
$config['def_height'] = $config['height'];
$this->image_lib->initialize($config);
If there is any beter solution, would love to see it.
To use
Code: // uses default width and height settings
$this->image_lib->thumbnail();
// uses passed value as width and height and creates square
$this->image_lib->thumbnail(100);
// uses first parameter for width and second for height
$this->image_lib->thumbnail(200, 150);
|