Seditio Source
Root |
./othercms/elxis_5.3_atlas_rev2452/includes/libraries/elxis/helpers/thumb.helper.php
<?php
/**
* @version        $Id: thumb.helper.php 1020 2012-04-10 20:22:36Z datahell $
* @package        Elxis
* @subpackage    Helpers / Thumb
* @copyright    Copyright (c) 2006-2012 Elxis CMS (http://www.elxis.org). All rights reserved.
* @license        Elxis Public License ( http://www.elxis.org/elxis-public-license.html )
* @author        Elxis Team ( http://www.elxis.org )
* @description     Elxis CMS is free software. Read the license for copyright notices and details
*/

defined('_ELXIS_') or die ('Direct access to this location is not allowed');


class
elxisThumbHelper {

    private
$default_width = 80;
    private
$quality = 80;
    private
$gdsupport = true;


   
/*********************/
    /* MAGIC CONSTRUCTOR */
    /*********************/
   
public function __construct() {
        if (!
function_exists('imagecreatetruecolor')) { $this->gdsupport = false; }
    }


   
/********************************/
    /* SET THUMBNAILS DEFAULT WIDTH */
    /********************************/
   
public function setDefaultWidth($width) {
       
$this->default_width = (int)$width;
    }


   
/**************************/
    /* SET THUMBNAILS QUALITY */
    /**************************/
   
public function setQuality($quality) {
       
$this->quality = (int)$quality;
    }


   
/********************************************************/
    /*   GENERATE, CACHE(OPTIONAL) AND SHOW THE THUMBNAIL   */
    /* If only make thumbnail use elxisFiles::resizeImage() */
    /********************************************************/
   
public function make($image, $width=0, $height=0, $crop=true, $use_cache=true) {
       
$eFiles = eFactory::getFiles();
        if (!
$this->gdsupport) { $this->fatalError('GD Library Error: function imagecreatetruecolor does not exist'); }
       
$image = ltrim($image, '/');
       
$abspath_src = $eFiles->elxisPath($image, false);
        if ((
$image == '') || !is_file($abspath_src)) { $this->makeBlankImage($width, $height); }
       
$imginfo = @getimagesize($abspath_src);
        if (!
$imginfo) { $this->makeBlankImage($width, $height); }
        if (!
in_array($imginfo[2], array(1, 2, 3))) {
           
$this->makeBlankImage($width, $height);
        }

       
$lastmodified_src = filemtime($abspath_src);

       
$width = (int)$width;
       
$height = (int)$height;
        if ((
$width < 1) && ($height < 1)) {
           
$width = $this->default_width;
           
$height = $width;
        } else if (
$width < 1) {
           
$width = intval($height * ($imginfo[0] / $imginfo[1]));
           
$crop = false;
        } else if (
$height < 1) {
           
$height = intval($width * ($imginfo[1] / $imginfo[0]));
           
$crop = false;
        }

       
$dst_x = 0;
       
$dst_y = 0;
       
$dst_w = $width;
       
$dst_h = $height;

        if (
$crop) {
           
$original_ratio = $imginfo[0] / $imginfo[1];
           
$thumb_ratio = $width / $height;
            if (
$original_ratio > $thumb_ratio) {
               
$crop = (($original_ratio - $thumb_ratio) < 0.1) ? false : true;
            } else {
               
$crop = (($thumb_ratio - $original_ratio) < 0.1) ? false : true;
            }
        }

        if (
$crop) {
            if (
$imginfo[0] > $imginfo[1]) {
               
$dst_w = $original_ratio * $height;
               
$dst_x = -(($dst_w - $width)/ 2);
               
$dst_x = (int)$dst_x;
            } elseif (
$imginfo[0] <= $imginfo[1]) {
               
$dst_h = $width / $original_ratio;
               
$dst_y = -(($dst_h - $height)/ 2);
               
$dst_y = (int)$dst_y;
            }
        }

       
$dst_w = round($dst_w);
       
$dst_h = round($dst_h);

        switch(
$imginfo[2]) {
            case
1:
               
$image_ext = 'gif';
               
$image_mime = 'image/gif';
            break;
            case
2:
               
$image_ext = 'jpg';
               
$image_mime = 'image/jpeg';
            break;
            case
3: default:
               
$image_ext = 'png';
               
$image_mime = 'image/png';
            break;
        }

        if (
$use_cache) {
           
$cache_image = md5($image.$lastmodified_src).'_'.$width.'x'.$height.'.'.$image_ext;
           
$this->showCached($cache_image, $image_mime);
           
$cache_image_abs = $eFiles->elxisPath('cache/thumbnails/'.$cache_image, true);
        }
         if ((
$imginfo[2] == 2) && function_exists('imagecreatefromjpeg')) { //JPG
           
$src_img = imagecreatefromjpeg($abspath_src);
            if (!
$src_img) { $this->fatalError('Could not create JPEG thumbnail!'); }
           
$dst_img = imagecreatetruecolor($width, $height);
           
imagecopyresampled($dst_img, $src_img, $dst_x, $dst_y, 0, 0, $dst_w, $dst_h, $imginfo[0], $imginfo[1]);
            if (!
$use_cache) {
                if (
ob_get_length() > 0) { ob_end_clean(); }
               
header('Content-type: '.$image_mime);
               
header("Content-Transfer-Encoding: Binary");
               
header('Content-Disposition: inline; filename='.basename($image));
               
header("Content-length: ".filesize($abspath_src));
               
header('Cache-Control: no-cache');
               
header('Pragma: no-cache');
               
imagejpeg($dst_img, null, $this->quality);
               
imagedestroy($src_img);
               
imagedestroy($dst_img);
                exit();
            }
            if (
touch($cache_image_abs)) {
               
chmod($cache_image_abs, 0666);
               
imagejpeg($dst_img, $cache_image_abs, $this->quality);
               
imagedestroy($src_img);
               
imagedestroy($dst_img);
               
$this->showCached($cache_image, $image_mime);
            } else {
                if (
ob_get_length() > 0) { ob_end_clean(); }
               
header('Content-type: '.$image_mime);
               
imagejpeg($dst_img, null, $this->quality);
               
imagedestroy($src_img);
               
imagedestroy($dst_img);
            }
            exit();
        } else if ((
$imginfo[2] == 3) && function_exists('imagecreatefrompng')) { //PNG
           
$src_img = imagecreatefrompng($abspath_src);
            if (!
$src_img){ $this->fatalError('Could not create PNG thumbnail!'); }
           
$dst_img = imagecreatetruecolor($width, $height);
           
$quality = ($this->quality - 100) / 11.111111;
           
$quality = round(abs($quality));
           
imagealphablending($dst_img, true);
           
imagesavealpha($dst_img, true);
           
$trans_color = imagecolorallocatealpha($dst_img, 0, 0, 0, 127);
           
imagefill($dst_img, 0, 0, $trans_color);
           
imagecopyresampled($dst_img, $src_img, $dst_x, $dst_y, 0, 0, $dst_w, $dst_h, $imginfo[0], $imginfo[1]);
            if (!
$use_cache) {
                if (
ob_get_length() > 0) { ob_end_clean(); }
               
header('Content-type: '.$image_mime);
               
header("Content-Transfer-Encoding: Binary");
               
header('Content-Disposition: inline; filename='.basename($image));
               
header("Content-length: ".filesize($abspath_src));
               
header('Cache-Control: no-cache');
               
header('Pragma: no-cache');
               
imagepng($dst_img, null, $quality);
               
imagedestroy($src_img);
               
imagedestroy($dst_img);
                exit();
            }
            if (
touch($cache_image_abs)) {
               
chmod($cache_image_abs, 0666);
               
imagepng($dst_img, $cache_image_abs, $quality);
               
imagedestroy($src_img);
               
imagedestroy($dst_img);
               
$this->showCached($cache_image, $image_mime);
            } else {
                if (
ob_get_length() > 0) { ob_end_clean(); }
               
header('Content-type: '.$image_mime);
               
imagepng($dst_img, null, $quality);
               
imagedestroy($src_img);
               
imagedestroy($dst_img);
            }
            exit();
        } else if ((
$imginfo[2] == 1) && function_exists('imagecreatefromgif')) { //GIF
           
$src_img = imagecreatefromgif($abspath_src);
            if (!
$src_img){ $this->fatalError('Could not create GIF thumbnail!'); }
           
$dst_img = imagecreatetruecolor($width, $height);
           
imagecopyresampled($dst_img, $src_img, $dst_x, $dst_y, 0, 0, $dst_w, $dst_h, $imginfo[0], $imginfo[1]);
            if (!
$use_cache) {
                if (
ob_get_length() > 0) { ob_end_clean(); }
               
header('Content-type: '.$image_mime);
               
header("Content-Transfer-Encoding: Binary");
               
header('Content-Disposition: inline; filename='.basename($image));
               
header("Content-length: ".filesize($abspath_src));
               
header('Cache-Control: no-cache');
               
header('Pragma: no-cache');
               
imagegif($dst_img, null);
               
imagedestroy($src_img);
               
imagedestroy($dst_img);
                exit();
            }
            if (
touch($cache_image_abs)) {
               
chmod($cache_image_abs, 0666);
               
imagegif($dst_img, $cache_image_abs);
               
imagedestroy($src_img);
               
imagedestroy($dst_img);
               
$this->showCached($cache_image, $image_mime);
            } else {
                if (
ob_get_length() > 0) { ob_end_clean(); }
               
header('Content-type: '.$image_mime);
               
imagegif($dst_img, null);
               
imagedestroy($src_img);
               
imagedestroy($dst_img);
            }
            exit();
        } else {
           
$this->fatalError('Could not create thumbnail!');
        }

        exit();
    }


   
/****************************************************/
    /* GENERATE, AND SHOW THE THUMBNAIL WITHOUT CACHING */
    /****************************************************/
   
public function show($image, $width=0, $height=0, $crop=true) {
       
$this->make($image, $width, $height, $crop, false);
    }


   
/*********************************/
    /* CREATE A BLANK IMAGE USING GD */
    /*********************************/
   
private function makeBlankImage($width=1, $height=1, $text='') {
        if (
$width < 1) { $width = 1; }
        if (
$height < 1) { $height = 1; }
       
$im = @imagecreate($width, $height) or die('Cannot Initialize new GD image stream');
       
$bg_colour = imagecolorallocate($im, 255, 255, 255);
        if (
$text != '') {
           
$text_colour = imagecolorallocate($im, 0, 0, 0);
           
imagestring($im, 2, 5, 5, $text, $text_colour);
        }
       
        if (
ob_get_length() > 0) { ob_end_clean(); }
       
header('Content-type: image/png');
       
header('Content-Disposition: inline; filename=blank.png');
       
header('Cache-Control: no-cache');
       
header('Pragma: no-cache');
       
imagepng($im);
       
imagedestroy($im);
        exit();
    }


   
/*******************************/
    /* SHOW CACHED IMAGE IF EXISTS */
    /*******************************/
   
private function showCached($cache_image, $mime) {
       
$eFiles = eFactory::getFiles();
        if (
$eFiles->createFolder('cache/thumbnails/', 0777, true) === true) {
           
$cache_file = $eFiles->elxisPath('cache/thumbnails/'.$cache_image, true);
            if (
file_exists($cache_file)) {
               
$gmdate_mod = gmdate('D, d M Y H:i:s', filemtime($cache_file)).' GMT';
                if (isset(
$_SERVER["HTTP_IF_MODIFIED_SINCE"])) {
                   
$if_modified_since = preg_replace("/;.*$/", "", $_SERVER["HTTP_IF_MODIFIED_SINCE"]);
                    if (
$if_modified_since == $gmdate_mod) {
                       
header("HTTP/1.1 304 Not Modified");
                        exit();
                    }
                }

                if (
ob_get_length() > 0) { ob_end_clean(); }
               
header('Content-Type: '.$mime);
               
header('Content-Disposition: inline; filename='.$cache_image);
               
header("Accept-Ranges: bytes");
               
header("Last-Modified: ".$gmdate_mod);
               
header("Content-Length: ".filesize($cache_file));
               
header("Cache-Control: max-age=86400, must-revalidate");
               
header("Expires: ".$gmdate_mod);
               
readfile($cache_file);
                exit();
            }
        }
    }


   
/********************/
    /* SHOW FATAL ERROR */
    /********************/
   
private function fatalError($message='') {
        if (
ob_get_length() > 0) { ob_end_clean(); }
       
header('HTTP/1.1 400 Bad Request');
        die(
$message);
    }

}

?>