clipbucket/upload/includes/classes/resizer.class.php
Fawaz ed555654b6 Added : Dynamic Fields for create_playlist
Added : insert_id() method in db.class.php
Added : featured and featured_date column in default
Added : Image resizer class
Added : Few new fuunctions in functions_playlist.php
Added : playlist cover option
2013-11-19 12:01:56 +00:00

957 lines
No EOL
38 KiB
PHP

<?php
/**
* Clipbucet Global Resizer
* ----------------------------------------------------------------------------
* All image resizing will be done through this class. It can resize, crop,
* flip both ways, rotate image, sharpen image and apply filters(only )
*
* @author Fawaz Tahir <fawaz.cb@gmail.com>
* @version 1.0
* ----------------------------------------------------------------------------
* Added : new $cropping CASE 10 on 19th September, 2012
* ----------------------------------------------------------------------------
* Example code for using $cropping CASE 10
*
* <code>
* include 'resizer.class.php';
* $resizer = new CB_Resizer( 'image.jpg' );
* //Setting cropping method
* $resizer->cropping = 10;
* // resizing
* $resizer->_resize( 720, 0 );
* </code>
*
* You might have noticed that only width is provided and not height. Normally,
* for cropping to work we need both width and height, so this will resize the image
* not crop it. What changes are made when setting $cropping to 10. Difference is,
* now this will check which side is bigger of source and set 720 to that side. If height
* is bigger than width, image height will be set to 720 and width is calculated, this also
* goes the other way.
*/
class CB_Resizer {
var $source; // filepath to source file
var $target; // complete filepath where file will be saved
var $quality; // image quality, for jpeg | default: 90
var $png_quality; // image quality, for png | default: 9
var $cropping; // cropping method | default: 5
var $preserve_aspect;
var $exact_dimensions;
var $bgcolor = "#FFFFFF";
var $watermark_placement;
var $watermark_padding = 10;
var $font = 'freeroad.ttf';
var $font_size = 48;
protected $fonts_dir = 'fonts/';
function __construct( $filepath = '' ) {
// Increasing memory limit for this proccess
// JPG usually takes alot of memory
ini_set('memory_limit', '256M');
$this->quality = 90;
$this->png_quality = 9;
$this->cropping = 5;
$this->preserve_aspect = $this->auto_resource = true;
$this->exact_dimensions = false;
$this->source = $filepath;
$this->target = '';
$this->number_of_colors = 25;
$this->_setup_filters();
}
/**
* resizing method
*/
function _resize( $width = 0, $height = 0, $background = null, $resource = null ) {
if ( $this->_check_resource( $resource ) ) {
if ( $width == 0 || $height == 0 ) {
$must_preserve_aspect = true;
}
if ( $this->preserve_aspect == true || $must_preserve_aspect == true ) {
if ( ( $width > 0 && $height == 0 ) && $this->cropping == 10 ) {
if ( $this->source_width > $this->source_height ) {
$aspect_ratio = $this->source_width / ( $width ? $width : $height );
} else {
$aspect_ratio = $this->source_height / ( $height ? $height : $width );
}
$target_width = round( $this->source_width / $aspect_ratio );
$target_height = round( $this->source_height / $aspect_ratio );
} else if ( $width > 0 && $height == 0 ) {
$aspect_ratio = $this->source_height / $this->source_width;
$target_width = $width;
$target_height = round( $width * $aspect_ratio );
} else if ( $width == 0 && $height > 0 ) {
$aspect_ratio = $this->source_width / $this->source_height;
$target_height = $height;
$target_width = round( $height * $aspect_ratio );
} else if ( $width > 0 && $height > 0 && $this->exact_dimensions == true ) {
$x_aspect_ratio = $this->source_width / $width;
$y_aspect_ratio = $this->source_height / $height;
if ( round( $this->source_height / $x_aspect_ratio ) < $height ) {
$target_width = $width;
$target_height = round( $this->source_height / $x_aspect_ratio );
} else {
$target_height = $height;
$target_width = round( $this->source_width / $y_aspect_ratio );
}
} else if ( $width > 0 && $height > 0 ) {
$x_aspect_ratio = $this->source_width / $width;
$y_aspect_ratio = $this->source_height / $height;
if ( $this->cropping != -1 ) {
$aspect_ratio = min( $x_aspect_ratio, $y_aspect_ratio );
} else {
/*
* If cropping is disabled and both width & height are
* provided, always use width to resize image.
*/
$aspect_ratio = ( $x_aspect_ratio );
}
$target_width = round( $this->source_width / $aspect_ratio );
$target_height = round( $this->source_height / $aspect_ratio );
} else {
$target_width = $this->source_width;
$target_height = $this->source_height;
}
} else {
$target_width = ( $width > 0 ? $width : $this->source_width );
$target_height = ( $height > 0 ? $height : $this->source_height );
}
$this->target_width = $target_width;
$this->target_height = $target_height;
if ( ($this->preserve_aspect == true || $must_preserve_aspect == true ) && $this->exact_dimensions != true ) {
$canvas = $this->_create_canvas( $target_width, $target_height, -1 );
imagecopyresampled( $canvas, $this->resource, 0, 0, 0, 0, $target_width, $target_height, $this->source_width, $this->source_height );
if ( $this->cropping != -1 && $width > 0 && $height > 0 && $this->cropping < 10 ) {
switch ( $this->cropping ) {
// TOP LEFT
case 1: {
$start_x = 0;
$start_y = 0;
$end_x = $width;
$end_y = $height;
}break;
// TOP CENTER
case 2: {
$start_x = ( $target_width - $width ) / 2;
$start_y = 0;
$end_x = ( ( $target_width - $width ) / 2 ) + $width;
$end_y = $height;
}break;
// TOP RIGHT
case 3 : {
$start_x = $target_width - $width;
$start_y = 0;
$end_x = $target_width;
$end_y = $height;
}break;
// LEFT
case 4 : {
$start_x = 0;
$start_y = ( $target_height - $height ) / 2;
$end_x = $width;
$end_y = ( ( $target_height - $height ) / 2 ) + $height;
}break;
// CENTER
case 5 : default : {
$start_x = ( $target_width - $width ) / 2;
$start_y = ( $target_height - $height ) / 2;
$end_x = ( ( $target_width - $width ) / 2 ) + $width;
$end_y = ( ( $target_height - $height ) / 2 ) + $height;
}
break;
// RIGHT
case 6 : {
$start_x = $target_width - $width;
$start_y = ( $target_height - $height ) / 2;
$end_x = $target_width;
$end_y = ( ( $target_height - $height ) / 2 ) + $height;
}
break;
// BOTTOM LEFT
case 7 : {
$start_x = 0;
$start_y = $target_height - $height;
$end_x = $width;
$end_y = $target_height;
}
break;
// BOTTOM CENTER
case 8 : {
$start_x = ( $target_width - $width ) / 2;
$start_y = $target_height - $height;
$end_x = ( ( $target_width - $width ) / 2 ) + $width;
$end_y = $target_height;
}
break;
// BOTTOM RIGHT
case 9: {
$start_x = $target_width - $width;
$start_y = $target_height - $height;
$end_x = $target_width;
$end_y = $target_height;
}
break;
}
return $this->_crop( $start_x, $start_y, $end_x, $end_y, $canvas );
}
} else {
$canvas = $this->_create_canvas( ( $width > 0 && $height > 0 ? $width : $target_width ), ( $width > 0 && $height > 0 ? $height : $target_height ), $background );
imagecopyresampled(
$canvas, $this->resource, ( $width > 0 && $height > 0 ? ( $width - $target_width ) / 2 : 0 ), ( $width > 0 && $height > 0 ? ( $height - $target_height ) / 2 : 0 ), 0, 0, $target_width, $target_height, $this->source_width, $this->source_height );
}
return $this->final_image = $canvas;
}
return false;
}
function resize( $width = 0, $height = 0, $background = null, $resource = null ) {
return $this->_resize( $width, $height, $background, $resource );
}
/**
* create resource from provided source method
*/
function _create_resource() {
if ( !function_exists( 'gd_info' ) ) {
echo 'no function';
return false;
} else if ( !is_file( $this->source ) ) {
echo 'no source file';
return false;
} else if ( !is_readable( $this->source ) ) {
echo 'no source readble';
return false;
} /*else if ( !is_writable( FOLDER ) ) {
echo 'no target writeable';
return false;
}*/ else {
list ( $this->source_width, $this->source_height, $this->source_type ) = getimagesize( $this->source );
$this->target_extension = $this->get_extension( $this->target );
switch ( $this->source_type ) {
// GIF
case 1: case IMAGETYPE_GIF: {
$resource = imagecreatefromgif( $this->source );
$this->gif_transparent_index = imagecolortransparent( $resource );
if ( $this->gif_transparent_index >= 0 ) {
$this->gif_transparent_color = imagecolorsforindex( $resource, $this->gif_transparent_index );
}
}
break;
// JPG
case 2: case IMAGETYPE_JPEG: {
$resource = imagecreatefromjpeg( $this->source );
}
break;
//PNG
case 3: case IMAGETYPE_PNG: {
$resource = imagecreatefrompng( $this->source );
imagealphablending( $resource, false );
}
break;
}
$this->resource = $resource;
return true;
}
return false;
}
/**
* Create a blank canvas with provided width and height
*/
function _create_canvas( $width, $height, $background = null ) {
$canvas = imagecreatetruecolor( ($width <= 0 ? (int) 1 : (int) $width ), ( $height <= 0 ? (int) 1 : (int) $height ) );
if ( is_null( $background ) ) {
$background = $this->bgcolor;
}
if ( $this->target_extension == 'png' && $background == -1 ) {
imagealphablending( $canvas, false );
$color = imagecolorallocatealpha( $canvas, 0, 0, 0, 127 );
imagefill( $canvas, 0, 0, $color );
imagesavealpha( $canvas, true );
} else if ( $this->target_extension == 'gif' && $this->gif_transparent_index >= 0 && $background == -1 ) {
$color = imagecolorallocate( $canvas, $this->gif_transparent_color['red'], $this->gif_transparent_color['green'], $this->gif_transparent_color['blue'] );
imagefill( $canvas, 0, 0, $color );
imagecolortransparent( $canvas, $color );
} else {
if ( $background == -1 ) {
$background = $this->bgcolor;
}
$color = $this->_hex2rgb( $background );
$color = imagecolorallocate( $canvas, $color['r'], $color['g'], $color['b'] );
imagefill( $canvas, 0, 0, $color );
}
return $canvas;
}
/**
* get extension of provided source or from global source
*/
function get_extension( $source = null ) {
if ( is_null( $source ) ) {
$source = $this->source;
}
return end( explode( ".", $source ) );
}
/**
* Convert HEX ( #FFF|#FFFFFF ) to rgb( red, green, blue )
*/
function _hex2rgb( $color ) {
if ( $color == -1 ) {
$color = $this->bgcolor;
}
$color = ltrim( $color, '#' );
if ( strlen( $color ) == 3 ) {
$tmp_code = '';
for ( $i = 0; $i < 3; $i++ ) {
$tmp_code .= str_repeat( $color[$i], 2 );
}
$color = $tmp_code;
}
list ( $r, $g, $b ) = str_split( $color, 2 );
$rgb = array('r' => hexdec( $r ), 'g' => hexdec( $g ), 'b' => hexdec( $b ));
return $rgb;
}
/**
* crop method
*/
function _crop( $x_start, $y_start, $x_end, $y_end, $resource = null ) {
if ( $this->_check_resource( $resource ) ) {
// Difference of end and start point is area that needs to be cropped
$canvas = $this->_create_canvas( $x_end - $x_start, $y_end - $y_start );
imagecopyresampled(
$canvas, $this->resource, 0, 0, $x_start, $y_start, $x_end - $x_start, $y_end - $y_start, $x_end - $x_start, $y_end - $y_start );
return $this->final_image = $canvas;
}
}
/**
* find sharpness method
* function from Ryan Rud (http://adryrun.com)
*/
function findSharp( $orig, $final ) {
$final = $final * (750.0 / $orig);
$a = 52;
$b = -0.27810650887573124;
$c = .00047337278106508946;
$result = $a + $b * $final + $c * $final * $final;
return max( round( $result ), 0 );
}
/**
* method used to display image in browser
*/
function display() {
$image = @$this->final_image;
if ( !is_resource( $image ) ) {
$image = $this->_check_resource();
}
{
switch ( $this->target_extension ? $this->target_extension : $this->get_extension($this->source) ) {
case "gif": {
header( 'Content-Type: image/gif' );
imagegif( $image );
$this->_destroy();
}break;
case "jpg": case "jpeg": {
header( 'Content-Type: image/jpeg' );
imagejpeg( $image, null, $this->quality );
$this->_destroy();
}break;
case "png" : {
header( 'Content-Type: image/png' );
imagepng( $image, null, $this->png_quality );
$this->_destroy();
}break;
}
}
}
/**
* method used to save image to provided $this->target
*/
function save() {
$image = @$this->final_image;
if ( !is_resource( $image ) ) {
$image = $this->_check_resource();
}
if ( is_resource( $image ) ) {
if ( (IMAGETYPE_PNG == $this->source_type || IMAGETYPE_GIF == $this->source_type ) && function_exists('imageistruecolor') && !imageistruecolor( $image ) && imagecolortransparent( $image ) > 0 ) {
imagetruecolortopalette( $image, false, imagecolorstotal( $image ) );
}
switch ( $this->target_extension ) {
case "gif": {
if ( !imagegif( $image, $this->target ) ) {
echo 'GIF Error';
return false;
} else {
$this->_destroy();
}
}
break;
case "jpg": case "jpeg": {
if ( !imagejpeg( $image, $this->target, $this->quality ) ) {
echo 'JPG Error';
return false;
} else {
$this->_destroy();
}
}
break;
case "png": {
if ( !imageistruecolor($image) && function_exists('imageistruecolor') ) {
imagetruecolortopalette( $image, false, imagecolorstotal($image) );
}
if ( !imagepng( $image, $this->target, $this->png_quality ) ) {
echo 'PNG Error';
return false;
} else {
$this->_destroy();
}
}
break;
}
} else {
echo 'Error Occured';
return false;
}
}
/**
* flipping the image
*/
function _flip( $side, $resource = null ) {
if ( $this->_check_resource( $resource ) ) {
$canvas = $this->_create_canvas( $this->source_width, $this->source_height . -1 );
switch ( $side ) {
case "vertical": {
imagecopyresampled(
$canvas, $this->resource, 0, 0, 0, ( $this->source_height - 1 ), $this->source_width, $this->source_height, $this->source_width, -$this->source_height );
}break;
case "horizontal": {
imagecopyresampled(
$canvas, $this->resource, 0, 0, ( $this->source_width - 1 ), 0, $this->source_width, $this->source_height, -$this->source_width, $this->source_height );
}break;
case "both": {
imagecopyresampled(
$canvas, $this->resource, 0, 0, ( $this->source_width - 1 ), ( $this->source_height - 1 ), $this->source_width, $this->source_height, -$this->source_width, -$this->source_height );
}break;
default: {
return false;
}break;
}
$this->final_image = $canvas;
return $this->final_image;
}
return false;
}
/**
* rotating the image
*/
function _rotate( $angle, $background = null, $resource = null) {
if ( is_null( $background ) ) {
$background = $this->bgcolor;
}
if ( $this->_check_resource( $resource) ) {
$angle = -$angle;
if ( $this->source_type == IMAGETYPE_PNG && $background == -1 ) {
// Because PNG8 fails to rotate, fill with default background color
if ( !$this->final_image = imagerotate( $this->resource, $angle, -1 ) ) {
$color = $this->_hex2rgb( $this->bgcolor );
$background = imagecolorallocate( $this->resource, $color['r'], $color['g'], $color['b'] );
$this->final_image = imagerotate( $this->resource, $angle, $background );
}
} else if ( $this->source_type == IMAGETYPE_GIF && $this->gif_transparent_index >= 0 ) {
$c = $this->_hex2rgb( $background );
$background_color = imagecolorallocate( $this->resource, $c['r'], $c['g'], $c['g'] );
$this->resource = imagerotate( $this->resource, $angle, $background_color );
// Transpareney is messed-up, we will recreate photo with imagecopysampled to
// preserve transparency
$width = imagesx( $this->resource );
$height = imagesy( $this->resource );
$canvas = $this->_create_canvas( $width, $height, -1 );
$this->final_image = imagecopyresampled( $canvas, $this->resource, 0, 0, 0, 0, $width, $height, $width, $height );
} else {
$c = $this->_hex2rgb( $background );
$background_color = imagecolorallocate( $this->resource, $c['r'], $c['g'], $c['b'] );
$this->final_image = imagerotate( $this->resource, $angle, $background_color );
}
return $this->final_image;
}
}
/**
* used to apply sharpness on image
*/
function _sharpit( $resource = null ) {
if ( !function_exists('imageconvolution') ) {
return false;
}
if ( $this->_check_resource( $resource ) ) {
$sharpness = $this->findSharp( $this->source_width, $this->target_width );
$sharpenMatrix = array(
array(-1, -1, -1),
array(-1, $sharpness + 10, -2),
array(-1, -1, -1)
);
$divisor = $sharpness;
$offset = 0;
// apply the matrix
imageconvolution( $this->resource, $sharpenMatrix, $divisor, $offset );
$this->final_image = $this->resource;
return $this->final_image;
}
}
/**
* Rotate left using _rotate method
*/
function rotate_left( $background = null, $resource = null ) {
return $this->_rotate( -90, $background, $resource );
}
/**
* Rotate right using _rotate method
*/
function rotate_right( $background = null, $resource = null ) {
return $this->_rotate( 90, $background, $resource );
}
/**
* Flip the image vertically and horizontally
*/
function flip( $resource = null) {
return $this->_flip( "both" , $resource);
}
/**
* Flip the image vertically
*/
function flip_vertical( $resource = null ) {
return $this->_flip( "vertical" , $resource );
}
/**
* Flip the image horizontally
*/
function flip_horizontal( $resource = null ) {
return $this->_flip( "horizontal" , $resource );
}
/**
* This method checks which resource to use
* 1 - If resource provided to function, used that else call _create_resource()
* 2 - If already has a resource and final_image, means we are working on some image
* apply all other methods to that resource
* 3 - _create_resource() from Source provided
*/
function _check_resource( $resource = null ) {
if ( !is_null( $resource) && is_resource($resource) ) {
$this->resource = $resource;
} else if (
$this->auto_resource == true &&
isset($this->resource) && is_resource( $this->resource) &&
isset( $this->final_image ) && is_resource( $this->final_image )
) {
$this->resource = $this->final_image;
$this->source_width = imagesx( $this->resource );
$this->source_height = imagesy( $this->resource );
} else {
$resource = $this->_create_resource();
}
if ( is_resource( $this->resource ) ) {
return $this->resource;
} else {
return false;
}
}
/**
* Destroy the resources
*/
function _destroy() {
if ( isset($this->resource) ) {
is_resource( $this->resource ) ? imagedestroy($this->resource) : false;
}
if ( isset($this->final_image) ) {
is_resource($this->final_image) ? imagedestroy($this->final_image) : false;
}
unset( $this->final_image );
unset( $this->resource );
}
/**
* Setup filters, if we have correct php version
*/
function _setup_filters() {
/* Making sure imagefilter function exists */
$php5 = substr(phpversion(),0,1);
if
(
( $php5 == 5 || $php5 > 5 )
&& function_exists('imagefilter')
&& defined('IMG_FILTER_NEGATE')
) {
$this->filters = array(
/* array is filter name and number of args it accepts */
1 => array(IMG_FILTER_NEGATE,0),
2 => array(IMG_FILTER_GRAYSCALE,0),
3 => array(IMG_FILTER_BRIGHTNESS,1), // level,+/-
4 => array(IMG_FILTER_CONTRAST,1), // level,+/-
5 => array(IMG_FILTER_COLORIZE,4), // r-g-b-a
6 => array(IMG_FILTER_EDGEDETECT,0),
7 => array(IMG_FILTER_EMBOSS,0),
8 => array(IMG_FILTER_GAUSSIAN_BLUR,0),
9 => array(IMG_FILTER_SELECTIVE_BLUR,0),
10 => array(IMG_FILTER_MEAN_REMOVAL,0),
11 => array(IMG_FILTER_SMOOTH,1)
);
$this->filters_alias = array(
'negative' => 1,
'grayscale' => 2,
'brightness' => 3,
'contrast' => 4,
'colorize' => 5,
'edgedetect' => 6,
'emboss' => 7,
'gaussian_blur' => 8,
'selective_blur' => 9,
'mean_removal' => 10,
'smooth' => 11
);
if ( phpversion() == '5.3.0' ) {
$this->filters[12] = array('IMG_FILTER_PIXELATE',2);
$this->filters_alias['pixelate'] = 12;
}
return $this->filters;
}
}
/**
* Apply filter to image resource
*/
function apply_filter ( $filters, $resource = null ) {
if ( isset( $this->filters) ) {
if ( $this->_check_resource( $resource ) ) {
// explode filters
$usr_filters = explode( ":", $filters );
if ( $usr_filters ) {
foreach ( $usr_filters as $filter ) {
$fs = explode(",",$filter);
if ( !is_numeric( $fs[0] ) ) {
if ( isset( $this->filters_alias[ $fs[0] ]) ) {
$fs[0] = $this->filters_alias[ $fs[0] ];
} else {
continue;
}
}
if ( isset( $this->filters[$fs[0]] ) ) {
for( $i=1; $i <= 4; $i++ ) {
if ( isset( $fs[$i] ) ) {
$fs[$i] = (int)$fs[$i];
} else {
$fs[$i] = null;
}
}
// make number of args the switch
switch( $this->filters[$fs[0]][1] ) {
case 0: {
imagefilter( $this->resource, $this->filters[$fs[0]][0] );
}break;
case 1: {
imagefilter( $this->resource, $this->filters[$fs[0]][0], $fs[1] );
}break;
case 2: {
imagefilter( $this->resource, $this->filters[$fs[0]][0], $fs[1], $fs[2] );
}break;
case 3: {
imagefilter( $this->resource, $this->filters[$fs[0]][0], $fs[1], $fs[2], $fs[3] );
}break;
case 4: {
imagefilter( $this->resource, $this->filters[$fs[0]][0], $fs[1], $fs[2], $fs[3], $fs[4] );
}break;
}
}
}
$this->final_image = $this->resource;
return $this->final_image;
}
}
}
}
/**
* Extract color palette from image
*/
function color_palette( $resource = null ) {
if ( $this->_check_resource( $resource ) ) {
if ( $this->source_width > 600 ) {
// Source is greater than 600, resize it to 600
$this->_resize( 600 );
$width = $this->target_width;
$height = $this->target_height;
} else {
$width = $this->source_width;
$height = $this->source_height;
}
$colors = array();
/* Thanks to NogDog: http://board.phpbuilder.com/board/showpost.php?p=10868783&postcount=2 */
for( $x = 0; $x < $width; $x+=12 ) {
for ($y=0; $y < $height; $y+=12 ) {
$thisColor = imagecolorat($this->resource, $x, $y);
$rgb = imagecolorsforindex($this->resource, $thisColor);
$red = round( round(($rgb['red'] / 0x33)) * 0x33 );
$green = round( round(($rgb['green'] / 0x33)) * 0x33 );
$blue = round( round(($rgb['blue'] / 0x33)) * 0x33 );
$thisRGB = sprintf('%02X%02X%02X', $red, $green, $blue);
if(array_key_exists($thisRGB, $colors))
{
$colors[$thisRGB]++;
}
else
{
$colors[$thisRGB] = 1;
}
}
}
arsort($colors);
$this->_destroy(); // free the memory by destroying resource
$total_colors = array_sum($colors);
foreach( $colors as $color => $count ) {
$ccolors[ $color ] = array(
'color' => '#'.$color,
'rgb' => implode( ",", $this->_hex2rgb('#'.$color) ),
'count' => $count,
'percent' => round( ( $count / $total_colors ) * 100, 3 )
);
}
return $ccolors;
}
}
function watermark( $watermark = null, $resource = null ) {
if ( $this->_check_resource( $resource ) ) {
if ( !is_null($watermark) && file_exists( $watermark ) && is_file( $watermark ) && strtolower(end(explode(".",$watermark))) == 'png' ) {
$resource = $this->resource;
$this->watermark = $wresource = imagecreatefrompng( $watermark );
$this->watermark_width = $wrx = imagesx($wresource);
$this->watermark_height = $wry = imagesy($wresource);
list ( $destX, $destY ) = $this->watermark_placement();
$cut = imagecreatetruecolor($wrx, $wry);
imagecopy( $cut, $resource, 0, 0, $destX, $destY, $wrx, $wry );
imagecopy( $cut, $wresource, 0, 0, 0, 0, $wrx, $wry );
imagecopymerge( $resource, $cut, $destX, $destY, 0, 0, $wrx, $wry, 100 );
} else {
/* Above contained failed, we will now use a string watermark */
//$this->string_watermark( $this->resource );
}
$this->final_image = $resource;
return $this->final_image;
}
}
/* Thanks to fodybrabec: http://www.php.net/manual/en/function.imagettfbbox.php#105593 */
function calculate_font_box( $text ) {
$font = $this->fonts_dir.$this->font;
$rect = imageftbbox($this->font_size, 0, $font, $text );
$minX = min(array($rect[0],$rect[2],$rect[4],$rect[6]));
$maxX = max(array($rect[0],$rect[2],$rect[4],$rect[6]));
$minY = min(array($rect[1],$rect[3],$rect[5],$rect[7]));
$maxY = max(array($rect[1],$rect[3],$rect[5],$rect[7]));
return array(
"left" => abs($minX) - 1,
"top" => abs($minY) - 1,
"width" => $maxX - $minX,
"height" => $maxY - $minY,
"box" => $rect
);
}
function string_watermark ( $resource = null ) {
if ( $this->_check_resource ( $resource ) ) {
$font_file = $this->fonts_dir.$this->font;
$this->font_size = round( ( ( $this->source_width + $this->source_height ) / 96 ) * 0.75 +14 );
$text = strtoupper( TITLE );
$color = imagecolorallocate($this->resource, 235, 235, 235 );
$shadow = imagecolorallocate($this->resource, 0, 0, 0 );
$return = $this->calculate_font_box( $text );
list ( $x, $y ) = $this->watermark_placement( $return );
imagefttext( $this->resource, $this->font_size, 0, $x, $y - 1, $shadow, $font_file, $text );
imagefttext( $this->resource, $this->font_size, 0, $x, $y, $color, $font_file, $text );
}
}
function watermark_placement( $string = false ) {
if ( !$this->watermark_placement ) {
$this->watermark_placement = "left:top";
}
list( $x, $y ) = explode(":", $this->watermark_placement );
if ( $string == false && !is_array( $string )) {
switch ( $x ) {
case "left":
default: {
$x = $this->watermark_padding;
}
break;
case "center": {
$x = ( $this->source_width - $this->watermark_width ) / 2;
}
break;
case "right": {
$x = ( $this->source_width - $this->watermark_width ) - $watermark_padding;
}
break;
}
switch ( $y ) {
case "top":
default: {
$y = $this->watermark_padding;
}
break;
case "center": {
$y = ( $this->source_height - $this->watermark_height ) / 2;
}
break;
case "bottom" : {
$y = ( $this->source_height - $this->watermark_height ) - $this->watermark_padding;
}
break;
}
} else {
switch( $x ) {
case "left":
default: {
$x = $string['left'] + $this->watermark_padding;
}
break;
case "center": {
$x = ( $this->source_width - $string['width'] ) / 2;
}
break;
case "right": {
$x = ( $this->source_width - $string['width'] ) - $this->watermark_padding;
}
break;
}
switch( $y ) {
case "top":
default: {
$y = $string['top'] + $this->watermark_padding;
}
break;
case "center": {
$y = ( $this->source_height + $string['height'] ) / 2;
}
break;
case "bottom": {
$y = ( $this->source_height - $string['height'] ) + $this->watermark_padding;
}
break;
}
}
return array( round( $x ), round( $y ) );
}
}
?>