Файл: Application/system/classes/class_SmartImage.php
Строк: 167
<?php
/**
 * Smart, easy and simple Image Manipulation
 * 
 * @author Alessandro Coscia, Milano, Italy, php_staff@yahoo.it
 * http://www.codicefacile.it/smartimage
 * @copyright LGPL
 * @version 0.9.6
 *
 */
class SmartImage {
    /**
     * Source file (path)
     */
    private $src;
    /**
     * GD image's identifier
     */
    private $gdID;
    /**
     * Image info
     */
    private $info;
    /**
     * Initialize image
     *
     * @param string $src
   * @param boolean $big
     * @return SmartImage
     */
    public function SmartImage($src, $bigImageSize=false) {
    // In case of very big images (more than 1Mb)
    if ($bigImageSize)
      $this->setMemoryForBigImage($src);
    
    // set data
    $this->src = $src;
    $this->info = getimagesize($src);
    
    // open file
    if ( $this->info[2] == 2 )        $this->gdID = imagecreatefromjpeg($this->src);
    elseif ( $this->info[2] == 1 )    $this->gdID = imagecreatefromgif($this->src);
    elseif ( $this->info[2] == 3 )     $this->gdID = imagecreatefrompng($this->src);
    
    }
  
  /**
   * Set memory in case of very big images (more than 1Mb)
   * new SmartImage($src, true) to activate this function
   * Works with (PHP 4 >= 4.3.2, PHP 5) if compiled with --enable-memory-limit
   *   or PHP>=5.2.1
   * Thanks to Andrvm and to Bascunan for this feature
   */
    private function setMemoryForBigImage($filename) {
    $imageInfo    = getimagesize($filename);
      $memoryNeeded = round(($imageInfo[0] * $imageInfo[1] * $imageInfo['bits'] * $imageInfo['channels'] / 8 + Pow(2, 16)) * 1.65);
       
      $memoryLimit = (int) ini_get('memory_limit')*1048576;
    
      if ((memory_get_usage() + $memoryNeeded) > $memoryLimit) {
         ini_set('memory_limit', ceil((memory_get_usage() + $memoryNeeded + $memoryLimit)/1048576).'M');
         return (true);
    }
      else return(false);
    }
    /**
     * Save the image on filesystem
     *
     * @param string $destination
     * @param integer 0-100 $jpegQuality
     */
    public function saveImage($destination, $jpegQuality = 100) {
        $this->outPutImage($destination, $jpegQuality);
    }
    /**
     * Output an image
     * accessible throught printImage() and saveImage()
     *
     * @param unknown_type $dest
     * @param unknown_type $jpegQuality
     */
    private function outPutImage($dest = '', $jpegQuality = 100) {
        $size = $this->info;
        $im = $this->gdID;
        // select mime
        if (!empty($dest))
            list($size['mime'], $size[2]) = $this->findMime($dest);
        
        // if output set headers
        if (empty($dest))    header('Content-Type: ' . $size['mime']);
        
        // output image
        if( $size[2] == 2 )            imagejpeg($im, $dest, $jpegQuality);
        elseif ( $size[2] == 1 )    imagegif($im, $dest);
        elseif ( $size[2] == 3 )    imagepng($im, $dest);
    }
    /**
     * Mime type for a file
     *
     * @param string $file
     * @return string
     */
    private function findMime($file) {
        $file .= ".";
        $bit = explode(".", $file);
        $ext = $bit[count($bit)-2];
        if ($ext == 'jpg')        return array('image/jpeg', 2);
        elseif ($ext == 'jpeg')    return array('image/jpeg', 2);
        elseif ($ext == 'gif')    return array('image/gif', 1);
        elseif ($ext == 'png')    return array('image/png', 3);
        else return array('image/jpeg', 2);
    }
    /**
     * Get the GD identifier
     *
     * @return GD Identifier
     */
    public function getGDid() {
        return $this->gdID;
    }
  
    /**
     * Get actual Image Size
     *
     * @return array('x' = integer, 'y' = integer)
     */
    public function getSize() {
    $size = $this->info;
        return array('x' => $size[0], 'y' => $size[1]);
    }
    
    /**
     * Set GD identifier
     *
     * @param GD Identifier $value
     */
    public function setGDid($value) {
        $this->gdID = $value;
    }
    /**
     * Free memory
     */
    public function close() {
        @imagedestroy($this->gdID);
    }
    
    /**
     * Update info class's variable
     */
    private function updateInfo() {
        $info = $this->info;
        $im = $this->gdID;
        
        $info[0] = imagesx($im);
        $info[1] = imagesy($im);
        
        $this->info = $info;
    }
    
    function myresize($value, $prop){
        
        $size = $this->info;
        $im = $this->gdID;
        $newwidth = $size[0];
        $newheight = $size[1];
    
        //---Determinar la propiedad a redimensionar y la propiedad opuesta
        $prop_value = ($prop == 'width') ? $newwidth : $newheight;
        $prop_versus = ($prop == 'width') ? $newheight : $newwidth;
        
        //---Determinar el valor opuesto a la propiedad a redimensionar
        $pcent = $value / $prop_value;
        $value_versus = $prop_versus * $pcent;
        
        //---Crear la imagen dependiendo de la propiedad a variar
        $image = ($prop == 'width') ? imagecreatetruecolor($value, $value_versus) : imagecreatetruecolor($value_versus, $value);
        
        //---Hacer una copia de la imagen dependiendo de la propiedad a variar
        switch($prop){
        
            case 'width':
                $result = imagecopyresampled($image, $im, 0, 0, 0, 0, $value, $value_versus, $newwidth, $newheight);
                break;
            
            case 'height':
                $result = imagecopyresampled($image, $im, 0, 0, 0, 0, $value_versus, $value, $newwidth, $newheight);
                break;
    
        }
    
        //---Actualizar la imagen y sus dimensiones
        $this->gdID = $image;
        $this->updateInfo();
        return $result;
    
    }    
    
    function mycrop($width, $height, $pos='center') {
        
        $size = $this->info;
        $im = $this->gdID;
        $o_wd = $size[0];
        $o_ht = $size[1];        
        
        if( ($o_wd/$width) < ($o_ht/$height))
        {
            $t_wd = $width;
            $t_ht = round($o_ht * $t_wd / $o_wd);
            
        }
        if(($o_wd/$width) > ($o_ht/$height))
        {
            $t_ht = $height;
            $t_wd = round($o_wd * $t_ht / $o_ht);
        }
        if(($o_wd/$width) == ($o_ht/$height))
        {
            $t_wd = $width;
            $t_ht = $height;
        }
        
        $image =  imageCreateTrueColor($t_wd, $t_ht);
        imagecopyresampled ($image, $im, 0, 0, 0, 0, $t_wd, $t_ht, $o_wd, $o_ht);
        
        $image2 =  imageCreateTrueColor($width, $height);
        switch($pos){
        
            case 'center':
                $cropStartX = ( $t_wd / 2) - ( $width /2 );
                $cropStartY = ( $t_ht/ 2) - ( $height/2 );  
                break;
            
            case 'left':
                $cropStartX = 0;
                $cropStartY = ( $t_ht/ 2) - ( $height/2 );  
                break;
            
            case 'right':
                $cropStartX = $t_wd - $width;
                $cropStartY = ( $t_ht/ 2) - ( $height/2 );
                break;
            
            case 'top':
                $cropStartX = ( $t_wd / 2) - ( $width /2 );
                $cropStartY = 0;
                break;
            
            case 'bottom':
                $cropStartX = ( $t_wd / 2) - ( $width /2 );
                $cropStartY = $t_ht - $height; 
                break;        
        }
            
        $result = imagecopyresampled($image2, $image, 0, 0,$cropStartX, $cropStartY, $width, $height, $width, $height);
        //---Actualizar la imagen y sus dimensiones
        $this->gdID = $image2;
        $this->updateInfo();
        return $result;
        
    }
  
}
?>