Вход Регистрация
Файл: core/asido/class.driver.gd.php
Строк: 266
<?php
/**
* @author Kaloyan K. Tsvetkov <kaloyan@kaloyan.info>
* @license http://opensource.org/licenses/lgpl-license.php GNU Lesser General Public License Version 2.1
* @package Asido
* @subpackage Asido.Driver.GD
* @version $Id: class.driver.gd.php 7 2007-04-09 21:09:09Z mrasnika $
*/

/////////////////////////////////////////////////////////////////////////////

/**
* Quality factor for saving JPEG files
* @see Asido_Driver_GD::Save()
*/
if (!defined('ASIDO_GD_JPEG_QUALITY')) {
        
define('ASIDO_GD_JPEG_QUALITY'90);
        }

/////////////////////////////////////////////////////////////////////////////

/**
* Asido GD(GD2) driver
*
* @package Asido
* @subpackage Asido.Driver.GD
*/
Class Asido_Driver_GD Extends Asido_Driver {

        
// -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

        /**
        * Maps to supported mime types
        * @var array
        * @access protected
        */
        
var $__mime = array(

                
// support reading
                //
                
'read' => array(

                        
// GIF
                        //
                        
'image/gif',

                        
// JPEG
                        //
                        
'application/jpg',
                        
'application/x-jpg',
                        
'image/jpg',
                        
'image/jpeg',

                        
// WBMP
                        //
                        
'image/wbmp',

                        
// XPM
                        //
                        
'image/x-xpixmap',
                        
'image/x-xpm',

                        
// XBM
                        //
                        
'image/x-xbitmap',
                        
'image/x-xbm',

                        
// PNG
                        //
                        
'application/png',
                        
'application/x-png',
                        
'image/x-png',
                        
'image/png',

                        ),

                
// support writing
                //
                
'write' => array(

                        
// GIF
                        //
                        
'image/gif',

                        
// JPEG
                        //
                        
'application/jpg',
                        
'application/x-jpg',
                        
'image/jpg',
                        
'image/jpeg',

                        
// WBMP
                        //
                        
'image/wbmp',

                        
// PNG
                        //
                        
'application/png',
                        
'application/x-png',
                        
'image/x-png',
                        
'image/png',
                        ),

                );

        
/**
        * Metaphone map for detecting image file extensions
        * @var array
        * @access private
        */
        
var $__mime_metaphone = array(
                        
'JPK' => 'image/jpeg',
                        
'JP' => 'image/jpeg',
                        
'JF' => 'image/gif',
                        
'NK' => 'image/png',
                        
'BMP' => 'image/wbmp',
                        
'SPM' => 'image/x-xbm',
                        
// 'SBM' => 'image/x-xpm',
                                // ^
                                // XPM is read-only and this map is used for
                                // saving files, so this XPM entry is useless
                
);

        
/**
        * Soundex map for detecting image file extensions
        * @var array
        * @access private
        */
        
var $__mime_soundex = array(
                        
'J120' => 'image/jpeg',
                        
'J100' => 'image/jpeg',
                        
'G100' => 'image/gif',
                        
'P520' => 'image/png',
                        
'B510' => 'image/wbmp',
                        
'W151' => 'image/wbmp',
                );

        
// -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

        /**
        * Checks whether the environment is compatible with this driver
        *
        * @return boolean
        * @access public
        */
        
function is_compatible() {

                if (!
extension_loaded('gd')) {
                        
trigger_error(
                                
'The Asido_Driver_GD driver is unnable to be '
                                        
' initialized, because the GD (php_gd2) '
                                        
' module is not installed',
                                
E_USER_ERROR
                                
);
                        return 
false;
                        }

                
// give access to all the memory
                //
                
@ini_set("memory_limit", -1);

                return 
true;
                }

        
// -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

        /**
        * Do the actual resize of an image
        *
        * @param Asido_TMP &$tmp
        * @param integer $width
        * @param integer $height
        * @return boolean
        * @access protected
        */
        
function __resize(&$tmp$width$height) {

                
// create new target
                //
                
$_ imageCreateTrueColor($width$height);
                
imageSaveAlpha($_true);
                
imageAlphaBlending($_false);

                
$r imageCopyResampled(
                        
$_$tmp->target,
                                
0,0,
                                
0,0,
                                
$width$height,
                                
$tmp->image_width$tmp->image_height
                        
);

                
// set new target
                //
                
$this->__destroy_target($tmp);
                
$tmp->target $_;

                return 
$r;
                }

        
/**
        * Copy one image to another
        *
        * @param Asido_TMP &$tmp_target
        * @param Asido_TMP &$tmp_source
        * @param integer $destination_x
        * @param integer $destination_y
        * @return boolean
        * @access protected
        */
        
function __copy(&$tmp_target, &$tmp_source$destination_x$destination_y) {

                
imageAlphaBlending($tmp_target->targettrue);
                
$r imageCopy($tmp_target->target$tmp_source->source,
                        
$destination_x$destination_y,
                        
00,
                        
$tmp_source->image_width$tmp_source->image_height
                        
);
                
imageAlphaBlending($tmp_target->targetfalse);

                return 
$r;
                }

        
/**
        * Make the image greyscale: supported only for PHP => 5.* and PHP => 4.0.1 except for PHP 4.3.11
        *
        * @param Asido_TMP &$tmp
        * @return boolean
        * @access protected
        */
        
function __grayscale(&$tmp) {

                
// the shorter path: function already exists
                //
                
if (function_exists('imagefilter')) {
                        return 
imagefilter($tmp->targetIMG_FILTER_GRAYSCALE);
                        return 
true;
                        }

                
// a bit wicked path: PHP 4.3.11 has a bug in this function
                //
                
if (!in_array(PHP_VERSION, array('4.3.11'))) {
                        return 
imageCopyMergeGray($tmp->target$tmp->target,
                                
0000,
                                
$tmp->image_width$tmp->image_height0);
                        }

                return 
false;
                }

        
/**
        * Rotate the image clockwise
        *
        * @param Asido_TMP &$tmp
        * @param float $angle
        * @param Asido_Color &$color
        * @return boolean
        * @access protected
        */
        
function __rotate(&$tmp$angle, &$color) {

                
// skip full loops
                //
                
if (($angle 360) == 0) {
                        return 
true;
                        }

                list(
$r$g$b) = $color->get();
                
$rotate_color imageColorAllocate($tmp->target$r$g$b);

                if (
$t imageRotate($tmp->target$angle * -1$rotate_color)) {
                        
imageDestroy($tmp->target);
                        
$tmp->target $t;

                        
$tmp->image_width imageSX($tmp->target);
                        
$tmp->image_height imageSY($tmp->target);

                        return 
true;
                        }

                return 
false;
                }

        
/**
        * Crop the image
        *
        * @param Asido_TMP &$tmp
        * @param integer $x
        * @param integer $y
        * @param integer $width
        * @param integer $height
        * @return boolean
        * @access protected
        */
        
function __crop(&$tmp$x$y$width$height) {

                
$t imageCreateTrueColor($width$height);
                
imageAlphaBlending($ttrue);
                
$r imageCopy($t$tmp->target,
                        
00,
                        
$x$y,
                        
$width$height
                        
);
                
imageAlphaBlending($tfalse);

                
$this->__destroy_target($tmp);
                
$tmp->target $t;
                
$tmp->image_width $width;
                
$tmp->image_height $height;

                return 
$r;
                }

        
/**
        * Vertically mirror (flip) the image: not supported
        *
        * @param Asido_TMP &$tmp
        * @return boolean
        * @access protected
        */
        
function __flip(&$tmp) {
                return 
false;
                }

        
/**
        * Horizontally mirror (flop) the image: not supported
        *
        * @param Asido_Image &$image
        * @return boolean
        * @access protected
        */
        
function __flop(&$tmp) {
                return 
false;
                }

        
// -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

        /**
        * Get canvas
        *
        * @param integer $width
        * @param integer $height
        * @param Asido_Color &$color
        * @return Asido_TMP
        * @access protected
        */
        
function __canvas($width$height, &$color) {

                
$t = new Asido_TMP;
                
$t->target imageCreateTrueColor($width$height);

                list(
$r$g$b) = $color->get();
                
imageFill($t->target11,
                        
imageColorAllocate($t->target$r$g$b)
                        );
                
$t->image_width $width;
                
$t->image_height $height;

                return 
$t;
                }

        
/**
        * Generate a temporary object for the provided argument
        *
        * @param mixed &$handler
        * @param string $filename the filename will be automatically generated
        *        on the fly, but if you want you can use the filename provided by
        *        this argument
        * @return Asido_TMP
        * @access protected
        */
        
function __tmpimage(&$handler$filename=null) {

                if (!isset(
$filename)) {
                        
$filename $this->__tmpfile();
                        }

                
imageAlphaBlending($handler0);
                
imageSaveAlpha($handler1);
                
imagePNG($handler$filename);
                        
// ^
                        // PNG: no pixel losts

                
return $this->prepare(
                        new 
Asido_Image($filename)
                        );
                }

        
// -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

        /**
        * Open the source and target image for processing it
        *
        * @param Asido_TMP &$tmp
        * @return boolean
        * @access protected
        */
        
function __open(&$tmp) {

                
$error_source false;
                
$error_target false;

                
// get image dimensions
                //
                
if ($i = @getImageSize($tmp->source_filename)) {
                        
$tmp->image_width $i[0];
                        
$tmp->image_height $i[1];
                        }

                
// image type ?
                //
                
switch(@$i[2]) {

                        case 
1:        // GIF
                                
$error_source = (false == (
                                        
$tmp->source = @imageCreateFromGIF(
                                                
$tmp->source_filename
                                                
)
                                        ));

                                
$error_target false == (
                                        
$tmp->target imageCreateTrueColor(
                                                
$tmp->image_width$tmp->image_height
                                                
)
                                        );
                                
$error_target &= imageCopyResampled(
                                        
$tmp->target$tmp->source,
                                        
0000,
                                        
$tmp->image_width$tmp->image_height,
                                        
$tmp->image_width$tmp->image_height
                                        
);

                                break;

                        case 
2// JPG
                                
$error_source = (false == (
                                        
$tmp->source imageCreateFromJPEG(
                                                
$tmp->source_filename
                                                
)
                                        ));

                                
$error_target = (false == (
                                        
$tmp->target imageCreateFromJPEG(
                                                
$tmp->source_filename
                                                
)
                                        ));
                                break;

                        case 
3// PNG
                                
$error_source = (false == (
                                        
$tmp->source = @imageCreateFromPNG(
                                                
$tmp->source_filename
                                                
)
                                        ));

                                
$error_target = (false == (
                                        
$tmp->target = @imageCreateFromPNG(
                                                
$tmp->source_filename
                                                
)
                                        ));
                                break;

                        case 
15// WBMP
                                
$error_source = (false == (
                                        
$tmp->source = @imageCreateFromWBMP(
                                                
$tmp->source_filename
                                                
)
                                        ));

                                
$error_target = (false == (
                                        
$tmp->target = @imageCreateFromWBMP(
                                                
$tmp->source_filename
                                                
)
                                        ));
                                break;

                        case 
16// XBM
                                
$error_source = (false == (
                                        
$tmp->source = @imageCreateFromXBM(
                                                
$tmp->source_filename
                                                
)
                                        ));

                                
$error_target = (false == (
                                        
$tmp->target = @imageCreateFromXBM(
                                                
$tmp->source_filename
                                                
)
                                        ));
                                break;

                        case 
4// SWF

                        
case 5// PSD

                        
case 6// BMP

                        
case 7// TIFF(intel byte order)

                        
case 8// TIFF(motorola byte order)

                        
case 9// JPC

                        
case 10// JP2

                        
case 11// JPX

                        
case 12// JB2

                        
case 13// SWC

                        
case 14// IFF

                        
default:

                                
$error_source = (false == (
                                        
$tmp->source = @imageCreateFromString(
                                                
file_get_contents(
                                                        
$tmp->source_filename
                                                        
)
                                                )
                                        ));

                                
$error_target = (false == (
                                        
$tmp->source = @imageCreateFromString(
                                                
file_get_contents(
                                                        
$tmp->source_filename
                                                        
)
                                                )
                                        ));
                                break;
                        }

                return !(
$error_source || $error_target);
                }

        
/**
        * Write the image after being processed
        *
        * @param Asido_TMP &$tmp
        * @return boolean
        * @access protected
        */
        
function __write(&$tmp) {

                
// try to guess format from extension
                //
                
if (!$tmp->save) {
                        
$p pathinfo($tmp->target_filename);

                        (
$tmp->save $this->__mime_metaphone[metaphone($p['extension'])])
                                || (
$tmp->save $this->__mime_soundex[soundex($p['extension'])]);
                        }

                
$result false;
                switch(
$tmp->save) {

                        case 
'image/gif' :
                                
imageTrueColorToPalette($tmp->targettrue256);
                                
$result = @imageGIF($tmp->target$tmp->target_filename);
                                break;

                        case 
'image/jpeg' :
                                
$result = @imageJPEG($tmp->target$tmp->target_filenameASIDO_GD_JPEG_QUALITY);
                                break;

                        case 
'image/wbmp' :
                                
$result = @imageWBMP($tmp->target$tmp->target_filename);
                                break;

                        default :
                        case 
'image/png' :

                                
imageSaveAlpha($tmp->targettrue);
                                
imageAlphaBlending($tmp->targetfalse);

                                
$result = @imagePNG($tmp->target$tmp->target_filename);
                                break;
                        }

                @
$this->__destroy_source($tmp);
                @
$this->__destroy_target($tmp);

                return 
$result;
                }

        
// -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

        /**
        * Destroy the source for the provided temporary object
        *
        * @param Asido_TMP &$tmp
        * @return boolean
        * @access protected
        * @abstract
        */
        
function __destroy_source(&$tmp) {
                return 
imageDestroy($tmp->source);
                }

        
/**
        * Destroy the target for the provided temporary object
        *
        * @param Asido_TMP &$tmp
        * @return boolean
        * @access protected
        * @abstract
        */
        
function __destroy_target(&$tmp) {
                return 
imageDestroy($tmp->target);
                }

        
// -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

//--end-of-class--
}

/////////////////////////////////////////////////////////////////////////////

?>
Онлайн: 0
Реклама