Your IP : 216.73.216.68


Current Path : /home/sunflowe/www/administrator/components/com_widgetkit/helpers/
Upload File :
Current File : /home/sunflowe/www/administrator/components/com_widgetkit/helpers/image.php

<?php
/**
* @package   Widgetkit
* @author    YOOtheme http://www.yootheme.com
* @copyright Copyright (C) YOOtheme GmbH
* @license   http://www.gnu.org/licenses/gpl.html GNU/GPL
*/

/*
	Class: ImageWidgetkitHelper
		Image helper class.
*/
class ImageWidgetkitHelper extends WidgetkitHelper {

	private $cHeight = '0';
	private $cWidth  = '0';
	private $image_data_base64 = '';

	/*
		Function: __construct
			Class Constructor.
	*/
	public function __construct($widgetkit) {
		parent::__construct($widgetkit);
	}

	/*
		Function: create
			Create a image object

		Parameters:
			$file - Image file path

		Returns:
			Object
	*/
	public function create($file) {
		return new WidgetkitImage($file);
	}

	/*
		Function: check
			Check GD library support

		Returns:
			Boolean
	*/
	public function check() {

		$gd_functions = array(
			'getimagesize',
			'imagecreatefromgif',
			'imagecreatefromjpeg',
			'imagecreatefrompng',
			'imagecreatetruecolor',
			'imagecopyresized',
			'imagecopy',
			'imagegif',
			'imagejpeg',
			'imagepng'
			);

		foreach ($gd_functions as $name) {
			if (!function_exists($name)) return false;
		}

		return true;
    }

	/*
		Function: prepareLazyload
			Prepare Html images for lazy loading

		Returns:
			String
	*/
	public function prepareLazyload($content) {

		if (stripos($content, '<img') !== false) {

			$imgs_regex = '#<img[^>]+>#im';
            preg_match_all($imgs_regex, $content, $images);

            foreach ($images as $img) {

            	$img = $img[0];

            	preg_match('/src=["|\']([^"]*)["|\']/i',$img, $src);
            	preg_match('/width=["|\']([^"]*)["|\']/i',$img, $width);
            	preg_match('/height=["|\']([^"]*)["|\']/i',$img, $height);

            	$img_src = $src[0];
            	if (!preg_match('/^(https?:)?\//', $src[1])) {
            		$img_src = 'src="' . JUri::base(true) .'/'. $src[1] .'"';
            	}

            	if ($width && $height) {
	            	if ($this->cWidth != $width[1] || $this->cHeight != $height[1]) {
	            		$this->cWidth = $width[1];
	            		$this->cHeight = $height[1];

	            		if ($image = imagecreatetruecolor($this->cWidth, $this->cHeight) ) {
		    				imagesavealpha($image, true);
						    $transparent = imagecolorallocatealpha($image, 0, 0, 0, 127);
						    imagefill($image, 0, 0, $transparent);

		            		ob_start ();
								imagepng ($image);
								$image_data = ob_get_contents ();
							ob_end_clean ();

							$this->image_data_base64 = base64_encode ($image_data);

		            	};
	            	}
	            	$tmp_image = str_replace($src[0], 'src="data:image/png;base64,'.$this->image_data_base64.'" data-'.$img_src, $img);
	            	$content = str_replace($img, $tmp_image, $content);
            	}
            }
        }

		return $content;
	}

}

/*
	Class: WidgetkitImage
		Image class for info, resizing.
*/
class WidgetkitImage {

	protected $_file;
	protected $_resource;

    public function __construct($file) {
		$this->_file = $file;
	}

	public function __destruct() {

		if (is_resource($this->_resource)) {
			imagedestroy($this->_resource);
		}

    }

	/*
		Function: options
			Retrieve image options

		Returns:
			Array
	*/
	public function options() {

		$data = @getimagesize($this->_file);

		foreach (array(0 => 'width', 1 => 'height', 'bits' => 'bits', 'mime' => 'mime') as $key => $name) {
			$options[$name] = $data[$key];

			if ($key == 'mime') {
				$options['format'] = str_replace('image/', '', $data[$key]);
			}
		}

		return $options;
	}

	/*
		Function: resource
			Retrieve image resource

		Returns:
			Array
	*/
	public function resource() {

		if (empty($this->_resource)) {

			extract($this->options());

			if ($format == 'jpeg') {
	        	$this->_resource = imagecreatefromjpeg($this->_file);
			} else if ($format == 'png') {
	        	$this->_resource = imagecreatefrompng($this->_file);
			} else if ($format == 'gif') {
	        	$this->_resource = imagecreatefromgif($this->_file);
			}

		}

		return $this->_resource;
	}

	/*
		Function: output
			Get image output

		Returns:
			Void
	*/
    public function output($options = array()) {

		$options = $this->_options($options);
		$image   = $this->_image($options);

		if ($options['format'] == 'jpeg') {
	      	imagejpeg($image, $options['file'], 90);
		} else if ($options['format'] == 'png') {
	       	imagepng($image, $options['file']);
		} else if ($options['format'] == 'gif') {
	       	imagegif($image, $options['file']);
		}

    }

	/*
		Function: _options
			Parse image options using defaults

		Returns:
			Array
	*/
    protected function _options($options) {

		// get options
		$source  = $this->options();
		$options = array_merge(array('format' => 'auto', 'width' => 'auto', 'height' => 'auto', 'resize' => true, 'file' => null), $options);

		// set format
		if ($options['format'] == 'auto') {
			$options['format'] = $source['format'];
		}

		// set size
		if (($options['width'] == 'auto' || !$options['width']) && ($options['height'] == 'auto' || !$options['height'])) {
			$options['width'] = $source['width'];
			$options['height'] = $source['height'];
		} else if (($options['width'] == 'auto' || !$options['width']) && is_numeric($options['height'])) {
			$options['width'] = @($options['height'] / $source['height']) * $source['width'];
		} else if (($options['height'] == 'auto' || !$options['height']) && is_numeric($options['width'])) {

			$options['height'] = @($options['width'] / $source['width']) * $source['height'];
		}

		return $options;
	}

	/*
		Function: _image
			Create image resource with current options

		Returns:
			Mixed
	*/
    protected function _image($options) {

		// init vars
		$source = $this->options();
		$source['image'] = $this->resource();
		$source['x'] = 0;
		$source['y'] = 0;

        // resize image
		if ($options['resize']) {

			$resized['width']  = @($options['height'] / $source['height']) * $source['width'];
			$resized['height'] = @($options['width'] / $source['width']) * $source['height'];

			if ($options['width'] <= $resized['width']) {
				$width  = $resized['width'];
				$height = $options['height'];
				$source['x'] = intval(($resized['width'] - $options['width']) / 2);
			} else {
				$width  = $options['width'];
				$height = $resized['height'];
				$source['y'] = intval(($resized['height'] - $options['height']) / 2);
			}

			$image = imagecreatetruecolor($width, $height);

			// save transparent colors
			if ($options['format'] == 'png') {
				imagecolortransparent($image, imagecolorallocate($image, 0, 0, 0));
				imagealphablending($image, false);
				imagesavealpha($image, true);
			}

			// get and reallocate transparency-color for gif
			if ($options['format'] == 'gif') {
				imagealphablending($image, false);
				$transindex = imagecolortransparent($source['image']) <= imagecolorstotal($image) ? imagecolortransparent($source['image']) : imagecolorstotal($image);
				if ($transindex >= 0) {
					$transcol = imagecolorsforindex($source['image'], $transindex);
					$transindex = imagecolorallocatealpha($image, $transcol['red'], $transcol['green'], $transcol['blue'], 127);
					imagefill($image, 0, 0, $transindex);
				}
			}

			if (function_exists('imagecopyresampled')) {
				@imagecopyresampled($image, $source['image'], 0, 0, 0, 0, $width, $height, $source['width'], $source['height']);
			} else {
				@imagecopyresized($image, $source['image'], 0, 0, 0, 0, $width, $height, $source['width'], $source['height']);
			}

			// restore transparency for gif
			if ($options['format'] == 'gif') {
				if ($transindex >= 0) {
					imagecolortransparent($image, $transindex);
					for ($y=0; $y < imagesy($image); ++$y) {
						for ($x=0; $x < imagesx($image); ++$x) {
							if (((imagecolorat($image, $x, $y)>>24) & 0x7F) >= 100) {
								imagesetpixel($image, $x, $y, $transindex);
							}
						}
					}
				}
			}

			$source['image'] = $image;
		}

        // create image
		$image = imagecreatetruecolor($options['width'], $options['height']);

		// save transparent colors for png
		if ($options['format'] == 'png') {
			imagecolortransparent($image, imagecolorallocate($source['image'], 0, 0, 0));
			imagealphablending($image, false);
			imagesavealpha($image, true);
		}

		// get and reallocate transparency-color for gif
		if ($options['format'] == 'gif') {
			imagealphablending($image, false);
			$transindex = imagecolortransparent($source['image']);
			if ($transindex >= 0) {
				$transcol = imagecolorsforindex($source['image'], $transindex);
				$transindex = imagecolorallocatealpha($image, $transcol['red'], $transcol['green'], $transcol['blue'], 127);
				imagefill($image, 0, 0, $transindex);
			}
		}

		@imagecopy($image, $source['image'], 0, 0, $source['x'], $source['y'], $options['width'], $options['height']);

		// restore transparency for gif
		if ($options['format'] == 'gif') {
			if ($transindex >= 0) {
				imagecolortransparent($image, $transindex);
				for ($y=0; $y < imagesy($image); ++$y) {
					for ($x=0; $x < imagesx($image); ++$x) {
						if (((imagecolorat($image, $x, $y)>>24) & 0x7F) >= 100) {
							imagesetpixel($image, $x, $y, $transindex);
						}
					}
				}
			}
		}

		return $image;
    }

}