| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153 |
- <?php if (!defined('BASEPATH')) exit('No direct script access allowed');
- /*
- * Image_Moo library
- *
- * Written due to image_lib not being so nice when you have to do multiple things to a single image!
- *
- * @license MIT License
- * @author Matthew Augier, aka Mat-Moo
- * @link http://www.dps.uk.com
- * @docu http://todo :)
- * @email matthew@dps.uk.com
- *
- * @file image_moo.php
- * @version 1.0.1
- * @date 2010 Dec 13
- *
- * Copyright (c) 2010 Matthew Augier
- *
- * Requires PHP 5 and GD2!
- *
- * Example usage
- * $this->image_moo->load("file")->resize(64,40)->save("thumb")->resize(640,480)->save("medium");
- * if ($this->image_moo->errors) print $this->image_moo->display_errors();
- *
- * COLOURS!
- * Any function that can take a colour as a parameter can take "#RGB", "#RRGGBB" or an array(R,G,B)
- *
- * image manipulation functions
- * -----------------------------------------------------------------------------
- * load($x) - Loads an image file specified by $x - JPG, PNG, GIF supported
- * save($x) - Saved the manipulated image (if applicable) to file $x - JPG, PNG, GIF supported
- * save_pa($prepend="", $append="", $overwrite=FALSE) - Saves using the original image name but with prepend and append text, e.g. load('moo.jpg')->save_pa('pre_','_app') would save as filename pre_moo_app.jpg
- * save_dynamic($filename="") - Saves as a stream output, use filename to return png/jpg/gif etc., default is jpeg
- * resize($x,$y,$pad=FALSE) - Proportioanlly resize original image using the bounds $x and $y, if padding is set return image is as defined centralised using BG colour
- * resize_crop($x,$y) - Proportioanlly resize original image using the bounds $x and $y but cropped to fill dimensions
- * stretch($x,$y) - Take the original image and stretch it to fill new dimensions $x $y
- * crop($x1,$y1,$x2,$y2) - Crop the original image using Top left, $x1,$y1 to bottom right $x2,y2. New image size =$x2-x1 x $y2-y1
- * rotate($angle) - Rotates the work image by X degrees, normally 90,180,270 can be any angle.Excess filled with background colour
- * load_watermark($filename, $transparent_x=0, $transparent_y=0) - Loads the specified file as the watermark file, if using PNG32/24 use x,y to specify direct positions of colour to use as index
- * make_watermark_text($text, $fontfile, $size=16, $colour="#ffffff", $angle=0) - Creates a text watermark
- * watermark($position, $offset=8, $abs=FALSE) - Use the loaded watermark, or created text to place a watermark. $position works like NUM PAD key layout, e.g. 7=Top left, 3=Bottom right $offset is the padding/indentation, if $abs is true then use $positiona and $offset as direct values to watermark placement
- * border($width,$colour="#000") - Draw a border around the output image X pixels wide in colour specified
- * border_3d($width,$rot=0,$opacity=30) - Draw a 3d border (opaque) around the current image $width wise in 0-3 rot positions, $opacity allows you to change how much it effects the picture
- * filter($function, $arg1=NULL, $arg2=NULL, $arg3=NULL, $arg4=NULL) -Runs the standard imagefilter GD2 command, see http://www.php.net/manual/en/function.imagefilter.php for details
- * round($radius,$invert=FALSE,$corners(array[top left, top right, bottom right, bottom left of true or False)="") default is all on and normal rounding
- * shadow($size=4, $direction=3, $colour="#444") - Size in pixels, note that the image will increase by this size, so resize(400,400)->shadoe(4) will give an image 404 pixels in size, Direction works on teh keypad basis like the watermark, so 3 is bottom right, $color if the colour of the shadow.
- * -----------------------------------------------------------------------------
- * image helper functions
- * display_errors($open = '<p>', $close = '</p>') - Display errors as Ci standard style
- * set_jpeg_quality($x) - quality to wrte jpeg files in for save, default 75 (1-100)
- * set_watermark_transparency($x) - the opacity of the watermark 1-100, 1-just about see, 100=solid
- * check_gd() - Run to see if you server can use this library
- * clear_temp() - Call to clear the temp changes using the master image again
- * clear() - Clears all images in memory
- * -----------------------------------------------------------------------------
- *
- * KNOWN BUGS
- * make_watermark_text does not deal with rotation angle correctly, box is cropped
- *
- * TO DO
- *
- * THANKS
- * Matjaž for poiting out the save_pa bug (should of tested it!)
- * Cahva for posting yet another bug in the save_pa (Man I can be silly sometimes!)
- * Cole spotting the resize flaw and providing a fix
- *
- */
- class Image_moo
- {
- // image vars
- private $main_image="";
- private $watermark_image;
- private $temp_image;
- private $jpeg_quality=75;
- private $background_colour="#ffffff";
- private $watermark_method;
- // other
- private $filename="";
- // watermark stuff, opacity
- private $watermark_transparency=50;
- // reported errors
- public $errors=FALSE;
- private $error_msg = array();
- // image info
- public $width=0;
- public $height=0;
- function Image_moo()
- //----------------------------------------------------------------------------------------------------------
- // create stuff here as needed
- //----------------------------------------------------------------------------------------------------------
- {
- log_message('debug', "Image Moo Class Initialized");
- }
- private function _clear_errors()
- //----------------------------------------------------------------------------------------------------------
- // load a resource
- //----------------------------------------------------------------------------------------------------------
- {
- $this->error_msg = array();
- }
- private function set_error($msg)
- //----------------------------------------------------------------------------------------------------------
- // Set an error message
- //----------------------------------------------------------------------------------------------------------
- {
- $this->errors = TRUE;
- $this->error_msg[] = $msg;
- }
- public function display_errors($open = '<p>', $close = '</p>')
- //----------------------------------------------------------------------------------------------------------
- // returns the errors formatted as needed, same as CI doed
- //----------------------------------------------------------------------------------------------------------
- {
- $str = '';
- foreach ($this->error_msg as $val)
- {
- $str .= $open.$val.$close;
- }
- return $str;
- }
- public function check_gd()
- //----------------------------------------------------------------------------------------------------------
- // verification util to see if you can use image_moo
- //----------------------------------------------------------------------------------------------------------
- {
- if ( ! extension_loaded('gd'))
- {
- if ( ! dl('gd.so'))
- {
- $this->set_error('GD library does not appear to be loaded');
- return FALSE;
- }
- }
- if (function_exists('gd_info'))
- {
- $gdarray = @gd_info();
- $versiontxt = ereg_replace('[[:alpha:][:space:]()]+', '', $gdarray['GD Version']);
- $versionparts=explode('.',$versiontxt);
- if ($versionparts[0]=="2")
- {
- return TRUE;
- }
- else
- {
- $this->set_error('Requires GD2, this reported as '.$versiontxt);
- return FALSE;
- }
- }
- else
- {
- $this->set_error('Could not verify GD version');
- return FALSE;
- }
- }
- private function _check_image()
- //----------------------------------------------------------------------------------------------------------
- // checks that we have an image loaded
- //----------------------------------------------------------------------------------------------------------
- {
- if (!is_resource($this->main_image))
- {
- $this->set_error("No main image loaded!");
- return FALSE;
- }
- else
- {
- return TRUE;
- }
- }
- function save_dynamic($filename="")
- //----------------------------------------------------------------------------------------------------------
- // Saves the temp image as a dynamic image
- // e.g. direct output to the browser
- //----------------------------------------------------------------------------------------------------------
- {
- // validate we loaded a main image
- if (!$this->_check_image()) return $this;
- // if no operations, copy it for temp save
- $this->_copy_to_temp_if_needed();
- // ok, lets go!
- if ($filename=="") $filename=rand(1000,999999).".jpg"; // send as jpeg
- $ext = strtoupper(pathinfo($filename, PATHINFO_EXTENSION));
- header("Content-disposition: filename=$filename;");
- header('Content-transfer-Encoding: binary');
- header('Last-modified: '.gmdate('D, d M Y H:i:s'));
- switch ($ext)
- {
- case "GIF" :
- header("Content-type: image/gif");
- imagegif($this->temp_image);
- return $this;
- break;
- case "JPG" :
- case "JPEG" :
- header("Content-type: image/jpeg");
- imagejpeg($this->temp_image, NULL, $this->jpeg_quality);
- return $this;
- break;
- case "PNG" :
- header("Content-type: image/png");
- imagepng($this->temp_image);
- return $this;
- break;
- }
- $this->set_error('Unable to save, extension not GIF/JPEG/JPG/PNG');
- return $this;
- }
- function save_pa($prepend="", $append="", $overwrite=FALSE)
- //----------------------------------------------------------------------------------------------------------
- // Saves the temp image as the filename specified,
- // overwrite = true of false
- //----------------------------------------------------------------------------------------------------------
- {
- // validate we loaded a main image
- if (!$this->_check_image()) return $this;
- // get current file parts
- $parts=pathinfo($this->filename);
- // save
- $this->save($parts["dirname"].'/'.$prepend.$parts['filename'].$append.'.'.$parts["extension"], $overwrite);
- return $this;
- }
- function save($filename,$overwrite=FALSE)
- //----------------------------------------------------------------------------------------------------------
- // Saves the temp image as the filename specified,
- // overwrite = true of false
- //----------------------------------------------------------------------------------------------------------
- {
- // validate we loaded a main image
- if (!$this->_check_image()) return $this;
- // if no operations, copy it for temp save
- $this->_copy_to_temp_if_needed();
- // check if it already exists
- if (!$overwrite)
- {
- // don't overwrite, so check for file
- if (file_exists($filename))
- {
- $this->set_error('File exists, overwrite is FALSE, could not save over file '.$filename);
- return $this;
- }
- }
- // find out the type of file to save
- $ext = strtoupper(pathinfo($filename, PATHINFO_EXTENSION));
- switch ($ext)
- {
- case "GIF" :
- imagegif($this->temp_image, $filename);
- return $this;
- break;
- case "JPG" :
- case "JPEG" :
- imagejpeg($this->temp_image, $filename, $this->jpeg_quality);
- return $this;
- break;
- case "PNG" :
- imagepng($this->temp_image, $filename);
- return $this;
- break;
- }
- // invalid filetype?!
- $this->set_error('Do no know what '.$ext.' filetype is in filename '.$filename);
- return $this;
- }
- private function _load_image($filename)
- //----------------------------------------------------------------------------------------------------------
- // private function to load a resource
- //----------------------------------------------------------------------------------------------------------
- {
- // check the request file can be located
- if (!file_exists($filename))
- {
- $this->set_error('Could not locate file '.$filename);
- return FALSE;
- }
- // get image info about this file
- $image_info=getimagesize($filename);
- // load file depending on mimetype
- switch ($image_info["mime"])
- {
- case "image/gif" :
- return imagecreatefromgif($filename);
- break;
- case "image/jpeg" :
- return imagecreatefromjpeg($filename);
- break;
- case "image/png" :
- return imagecreatefrompng($filename);
- break;
- }
- // invalid filetype?!
- $this->set_error('Unable to load '.$filename.' filetype '.$image_info["mime"].'not recognised');
- return FALSE;
- }
- public function load($filename)
- //----------------------------------------------------------------------------------------------------------
- // Load an image, public function
- //----------------------------------------------------------------------------------------------------------
- {
- // new image, reset error messages
- $this->_clear_errors();
- // remove temporary image stored
- $this->clear_temp();
- // save filename
- $this->filename=$filename;
- // reset width and height
- $this->width = 0;
- $this->height = 0;
- // load it
- $this->main_image = $this->_load_image($filename);
- // no error, then get the dminesions set
- if ($this->main_image <> FALSE)
- {
- $this->width = imageSX($this->main_image);
- $this->height = imageSY($this->main_image);
- }
- // return the object
- return $this;
- }
- public function load_watermark($filename, $transparent_x=NULL, $transparent_y=NULL)
- //----------------------------------------------------------------------------------------------------------
- // Load an image, public function
- //----------------------------------------------------------------------------------------------------------
- {
- if(is_resource($this->watermark_image)) imagedestroy($this->watermark_image);
- $this->watermark_image = $this->_load_image($filename);
- if(is_resource($this->watermark_image))
- {
- $this->watermark_method = 1;
- if(($transparent_x <> NULL) AND ($transparent_y <> NULL))
- {
- // get the top left corner colour allocation
- $tpcolour = imagecolorat($this->watermark_image, $transparent_x, $transparent_y);
- // set this as the transparent colour
- imagecolortransparent($this->watermark_image, $tpcolour);
- // $set diff method
- $this->watermark_method = 2;
- }
- }
- // return this object
- return $this;
- }
- public function set_watermark_transparency($transparency=50)
- //----------------------------------------------------------------------------------------------------------
- // Sets the quality that jpeg will be saved at
- //----------------------------------------------------------------------------------------------------------
- {
- $this->watermark_transparency = $transparency;
- return $this;
- }
- public function set_background_colour($colour="#ffffff")
- //----------------------------------------------------------------------------------------------------------
- // Sets teh background colour to use on rotation and padding for resize
- //----------------------------------------------------------------------------------------------------------
- {
- $this->background_colour = $this->_html2rgb($colour);
- return $this;
- }
- public function set_jpeg_quality($quality=75)
- //----------------------------------------------------------------------------------------------------------
- // Sets the quality that jpeg will be saved at
- //----------------------------------------------------------------------------------------------------------
- {
- $this->jpeg_quality = $quality;
- return $this;
- }
- private function _copy_to_temp_if_needed()
- //----------------------------------------------------------------------------------------------------------
- // If temp image is empty, e.g. not resized or done anything then just copy main image
- //----------------------------------------------------------------------------------------------------------
- {
- if (!is_resource($this->temp_image))
- {
- // create a temp based on new dimensions
- $this->temp_image = imagecreatetruecolor($this->width, $this->height);
- // check it
- if(!is_resource($this->temp_image))
- {
- $this->set_error('Unable to create temp image sized '.$this->width.' x '.$this->height);
- return FALSE;
- }
- // copy image to temp workspace
- imagecopy($this->temp_image, $this->main_image, 0, 0, 0, 0, $this->width, $this->height);
- }
- }
- public function clear()
- //----------------------------------------------------------------------------------------------------------
- // clear everything!
- //----------------------------------------------------------------------------------------------------------
- {
- if(is_resource($this->main_image)) imagedestroy($this->main_image);
- if(is_resource($this->watermark_image)) imagedestroy($this->watermark_image);
- if(is_resource($this->temp_image)) imagedestroy($this->temp_image);
- return $this;
- }
- public function clear_temp()
- //----------------------------------------------------------------------------------------------------------
- // you may want to revert back to teh original image to work on, e.g. watermark, this clears temp
- //----------------------------------------------------------------------------------------------------------
- {
- if(is_resource($this->temp_image)) imagedestroy($this->temp_image);
- return $this;
- }
- public function resize_crop($mw,$mh)
- //----------------------------------------------------------------------------------------------------------
- // take main image and resize to tempimage using EXACT boundaries mw,mh (max width and max height)
- // this is proportional and crops the image centrally to fit
- //----------------------------------------------------------------------------------------------------------
- {
- if (!$this->_check_image()) return $this;
- // clear temp image
- $this->clear_temp();
- // create a temp based on new dimensions
- $this->temp_image = imagecreatetruecolor($mw,$mh);
- // check it
- if(!is_resource($this->temp_image))
- {
- $this->set_error('Unable to create temp image sized '.$mw.' x '.$mh);
- return $this;
- }
- // work out best positions for copy
- $wx=$this->width / $mw;
- $wy=$this->height / $mh;
- if ($wx >= $wy)
- {
- // use full height
- $sy = 0;
- $sy2 = $this->height;
- // calcs
- $calc_width = $mw * $wy;
- $sx = ($this->width - $calc_width) / 2;
- $sx2 = $calc_width;
- }
- else
- {
- // use full width
- $sx = 0;
- $sx2 = $this->width;
- // calcs
- $calc_height = $mh * $wx;
- $sy = ($this->height - $calc_height) / 2;
- $sy2 = $calc_height;
- }
- // copy section
- imagecopyresampled($this->temp_image, $this->main_image, 0, 0, $sx, $sy, $mw, $mh, $sx2, $sy2);
- return $this;
- }
- public function resize($mw, $mh, $pad=FALSE)
- //----------------------------------------------------------------------------------------------------------
- // take main image and resize to tempimage using boundaries mw,mh (max width or max height)
- // this is proportional, pad to true will set it in the middle of area size
- //----------------------------------------------------------------------------------------------------------
- {
- if (!$this->_check_image()) return $this;
- // calc new dimensions
- if( $this->width > $mw || $this->height > $mh ) {
- // if( $this->width > $this->height ) { could calc wronf - Cole Thorsen swapped to his suggestion
- if( ($this->width / $this->height) > ($mw / $mh) ) {
- $tnw = $mw;
- $tnh = $tnw * $this->height / $this->width;
- } else {
- $tnh = $mh;
- $tnw = $tnh * $this->width / $this->height;
- }
- } else {
- $tnw = $this->width;
- $tnh = $this->height;
- }
- // clear temp image
- $this->clear_temp();
- // create a temp based on new dimensions
- if ($pad)
- {
- $tx = $mw;
- $ty = $mh;
- $px = ($mw - $tnw) / 2;
- $py = ($mh - $tnh) / 2;
- }
- else
- {
- $tx = $tnw;
- $ty = $tnh;
- $px = 0;
- $py = 0;
- }
- $this->temp_image = imagecreatetruecolor($tx,$ty);
- // check it
- if(!is_resource($this->temp_image))
- {
- $this->set_error('Unable to create temp image sized '.$tx.' x '.$ty);
- return $this;
- }
- // if padding, fill background
- if ($pad)
- {
- $col = $this->_html2rgb($this->background_colour);
- $bg = imagecolorallocate($this->temp_image, $col[0], $col[1], $col[2]);
- imagefilledrectangle($this->temp_image, 0, 0, $tx, $ty, $bg);
- }
- // copy resized
- imagecopyresampled($this->temp_image, $this->main_image, $px, $py, 0, 0, $tnw, $tnh, $this->width, $this->height);
- return $this;
- }
- public function stretch($mw,$mh)
- //----------------------------------------------------------------------------------------------------------
- // take main image and resize to tempimage using boundaries mw,mh (max width or max height)
- // does not retain proportions
- //----------------------------------------------------------------------------------------------------------
- {
- if (!$this->_check_image()) return $this;
- // clear temp image
- $this->clear_temp();
- // create a temp based on new dimensions
- $this->temp_image = imagecreatetruecolor($mw, $mh);
- // check it
- if(!is_resource($this->temp_image))
- {
- $this->set_error('Unable to create temp image sized '.$mh.' x '.$mw);
- return $this;
- }
- // copy resized (stethced, proportions not kept);
- imagecopyresampled($this->temp_image, $this->main_image, 0, 0, 0, 0, $mw, $mh, $this->width, $this->height);
- return $this;
- }
- public function crop($x1, $y1, $x2, $y2)
- //----------------------------------------------------------------------------------------------------------
- // crop the main image to temp image using coords
- //----------------------------------------------------------------------------------------------------------
- {
- if (!$this->_check_image()) return $this;
- // clear temp image
- $this->clear_temp();
- // check dimensions
- if ($x1 < 0 || $y1 < 0 || $x2 - $x1 > $this->width || $y2 - $y1 > $this->height)
- {
- $this->set_error('Invalid crop dimensions, either - passed or width/heigh too large '.$x1.'/'.$y1.' x '.$x2.'/'.$y2);
- return $this;
- }
- // create a temp based on new dimensions
- $this->temp_image = imagecreatetruecolor($x2-$x1, $y2-$y1);
- // check it
- if(!is_resource($this->temp_image))
- {
- $this->set_error('Unable to create temp image sized '.$x2-$x1.' x '.$y2-$y1);
- return $this;
- }
- // copy cropped portion
- imagecopy($this->temp_image, $this->main_image, 0, 0, $x1, $y1, $x2 - $x1, $y2 - $y1);
- return $this;
- }
- private function _html2rgb($colour)
- //----------------------------------------------------------------------------------------------------------
- // convert #aa0011 to a php colour array
- //----------------------------------------------------------------------------------------------------------
- {
- if (is_array($colour))
- {
- if (count($colour)==3) return $colour; // rgb sent as an array so use it
- $this->set_error('Colour error, array sent not 3 elements, expected array(r,g,b)');
- return false;
- }
- if ($colour[0] == '#')
- $colour = substr($colour, 1);
- if (strlen($colour) == 6)
- {
- list($r, $g, $b) = array($colour[0].$colour[1],
- $colour[2].$colour[3],
- $colour[4].$colour[5]);
- }
- elseif (strlen($colour) == 3)
- {
- list($r, $g, $b) = array($colour[0].$colour[0], $colour[1].$colour[1], $colour[2].$colour[2]);
- }
- else
- {
- $this->set_error('Colour error, value sent not #RRGGBB or RRGGBB, and not array(r,g,b)');
- return false;
- }
- $r = hexdec($r); $g = hexdec($g); $b = hexdec($b);
- return array($r, $g, $b);
- }
- public function rotate($angle)
- //----------------------------------------------------------------------------------------------------------
- // rotate an image bu 0 / 90 / 180 / 270 degrees
- //----------------------------------------------------------------------------------------------------------
- {
- // validate we loaded a main image
- if (!$this->_check_image()) return $this;
- // if no operations, copy it for temp save
- $this->_copy_to_temp_if_needed();
- // set the colour
- $col = $this->_html2rgb($$this->background_colour);
- $bg = imagecolorallocate($this->temp_image, $col[0], $col[1], $col[2]);
- // rotate as needed
- $this->temp_image = imagerotate($this->temp_image, $angle, $bg);
- return $this;
- }
- public function make_watermark_text($text, $fontfile, $size=16, $colour="#ffffff", $angle=0)
- //----------------------------------------------------------------------------------------------------------
- // create an image from text that can be applied as a watermark
- // text is the text to write, $fontile is a ttf file that will be used $size=font size, $colour is the colour of text
- //----------------------------------------------------------------------------------------------------------
- {
- // check font file can be found
- if (!file_exists($fontfile))
- {
- $this->set_error('Could not locate font file "'.$fontfile.'"');
- return $this;
- }
- // validate we loaded a main image
- if (!$this->_check_image())
- {
- $remove = TRUE;
- // no image loaded so make temp image to use
- $this->main_image = imagecreatetruecolor(1000,1000);
- }
- else
- {
- $remove = FALSE;
- }
- // work out text dimensions
- $bbox = imageftbbox($size, $angle, $fontfile, $text);
- $bw = abs($bbox[4] - $bbox[0]) + 1;
- $bh = abs($bbox[1] - $bbox[5]) + 1;
- $bl = $bbox[1];
- // use this to create watermark image
- if(is_resource($this->watermark_image)) imagedestroy($this->watermark_image);
- $this->watermark_image = imagecreatetruecolor($bw, $bh);
- // set colours
- $col = $this->_html2rgb($colour);
- $font_col = imagecolorallocate($this->watermark_image, $col[0], $col[1], $col[2]);
- $bg_col = imagecolorallocate($this->watermark_image, 127, 128, 126);
- // set method to use
- $this->watermark_method = 2;
- // create bg
- imagecolortransparent($this->watermark_image, $bg_col);
- imagefilledrectangle($this->watermark_image, 0,0, $bw, $bh, $bg_col);
- // write text to watermark
- imagefttext($this->watermark_image, $size, $angle, 0, $bh-$bl, $font_col, $fontfile, $text);
- if ($remove) imagedestroy($this->main_image);
- return $this;
- }
- public function watermark($position, $offset=8, $abs=FALSE)
- //----------------------------------------------------------------------------------------------------------
- // add a watermark to the image
- // position works like a keypad e.g.
- // 7 8 9
- // 4 5 6
- // 1 2 3
- // offset moves image inwards by x pixels
- // if abs is set then $position, $offset = direct placement coords
- //----------------------------------------------------------------------------------------------------------
- {
- // validate we loaded a main image
- if (!$this->_check_image()) return $this;
- // validate we have a watermark
- if(!is_resource($this->watermark_image))
- {
- $this->set_error("Can't watermark image, no watermark loaded/created");
- return $this;
- }
- // if no operations, copy it for temp save
- $this->_copy_to_temp_if_needed();
- // get watermark width
- $wm_w = imageSX($this->watermark_image);
- $wm_h = imageSY($this->watermark_image);
- // get temp widths
- $temp_w = imageSX($this->temp_image);
- $temp_h = imageSY($this->temp_image);
- // check watermark will fit!
- if ($wm_w > $temp_w || $wm_h > $temp_h)
- {
- $this->set_error("Watermark is larger than image. WM: $wm_w x $wm_h Temp image: $temp_w x $temp_h");
- return $this;
- }
- if ($abs)
- {
- // direct placement
- $dest_x = $position;
- $dest_y = $offset;
- }
- else
- {
- // do X position
- switch ($position)
- {
- // x left
- case "7":
- case "4":
- case "1":
- $dest_x = $offset;
- break;
- // x middle
- case "8":
- case "5":
- case "2":
- $dest_x = ($temp_w - $wm_w) /2 ;
- break;
- // x right
- case "9":
- case "6":
- case "3":
- $dest_x = $temp_w - $offset - $wm_w;
- break;
- default:
- $dest_x = $offset;
- $this->set_error("Watermark position $position not in vlaid range 7,8,9 - 4,5,6 - 1,2,3");
- }
- // do y position
- switch ($position)
- {
- // y top
- case "7":
- case "8":
- case "9":
- $dest_y = $offset;
- break;
- // y middle
- case "4":
- case "5":
- case "6":
- $dest_y = ($temp_h - $wm_h) /2 ;
- break;
- // y bottom
- case "1":
- case "2":
- case "3":
- $dest_y = $temp_h - $offset - $wm_h;
- break;
- default:
- $dest_y = $offset;
- $this->set_error("Watermark position $position not in vlaid range 7,8,9 - 4,5,6 - 1,2,3");
- }
- }
- // copy over temp image to desired location
- if ($this->watermark_method == 1)
- {
- // use back methods to do this, taken from php help files
- //$this->imagecopymerge_alpha($this->temp_image, $this->watermark_image, $dest_x, $dest_y, 0, 0, $wm_w, $wm_h, $this->watermark_transparency);
- $opacity=$this->watermark_transparency;
- // creating a cut resource
- $cut = imagecreatetruecolor($wm_w, $wm_h);
- // copying that section of the background to the cut
- imagecopy($cut, $this->temp_image, 0, 0, $dest_x, $dest_y, $wm_w, $wm_h);
- // inverting the opacity
- $opacity = 100 - $opacity;
- // placing the watermark now
- imagecopy($cut, $this->watermark_image, 0, 0, 0, 0, $wm_w, $wm_h);
- imagecopymerge($this->temp_image, $cut, $dest_x, $dest_y, 0, 0, $wm_w, $wm_h, $opacity);
- }
- else
- {
- // use normal with selected transparency colour
- imagecopymerge($this->temp_image, $this->watermark_image, $dest_x, $dest_y, 0, 0, $wm_w, $wm_h, $this->watermark_transparency);
- }
- return $this;
- }
- public function border($width=5,$colour="#000")
- //----------------------------------------------------------------------------------------------------------
- // add a solidborder frame, coloured $colour to the image
- //----------------------------------------------------------------------------------------------------------
- {
- // validate we loaded a main image
- if (!$this->_check_image()) return $this;
- // if no operations, copy it for temp save
- $this->_copy_to_temp_if_needed();
- // get colour set for temp image
- $col = $this->_html2rgb($colour);
- $border_col = imagecolorallocate($this->temp_image, $col[0], $col[1], $col[2]);
- // get temp widths
- $temp_w = imageSX($this->temp_image);
- $temp_h = imageSY($this->temp_image);
- // do border
- for($x=0;$x<$width;$x++)
- {
- imagerectangle($this->temp_image, $x, $x, $temp_w-$x-1, $temp_h-$x-1, $border_col);
- }
- // return object
- return $this;
- }
- public function border_3d($width=5,$rot=0,$opacity=30)
- //----------------------------------------------------------------------------------------------------------
- // overlay a black white border to make it look 3d
- //----------------------------------------------------------------------------------------------------------
- {
- // validate we loaded a main image
- if (!$this->_check_image()) return $this;
- // if no operations, copy it for temp save
- $this->_copy_to_temp_if_needed();
- // get temp widths
- $temp_w = imageSX($this->temp_image);
- $temp_h = imageSY($this->temp_image);
- // create temp canvas to merge
- $border_image = imagecreatetruecolor($temp_w, $temp_h);
- // create colours
- $black = imagecolorallocate($border_image, 0, 0, 0);
- $white = imagecolorallocate($border_image, 255, 255, 255);
- switch ($rot)
- {
- case 1 :
- $cols=array($white,$black,$white,$black);
- break;
- case 2 :
- $cols=array($black,$black,$white,$white);
- break;
- case 3 :
- $cols=array($black,$white,$black,$white);
- break;
- default :
- $cols=array($white,$white,$black,$black);
- }
- $bg_col = imagecolorallocate($border_image, 127, 128, 126);
- // create bg
- imagecolortransparent($border_image, $bg_col);
- imagefilledrectangle($border_image, 0,0, $temp_w, $temp_h, $bg_col);
- // do border
- for($x=0;$x<$width;$x++)
- {
- // top
- imageline($border_image, $x, $x, $temp_w-$x-1, $x, $cols[0]);
- // left
- imageline($border_image, $x, $x, $x, $temp_w-$x-1, $cols[1]);
- // bottom
- imageline($border_image, $x, $temp_h-$x-1, $temp_w-1-$x, $temp_h-$x-1, $cols[3]);
- // right
- imageline($border_image, $temp_w-$x-1, $x, $temp_w-$x-1, $temp_h-$x-1, $cols[2]);
- }
- // merg with temp image
- imagecopymerge($this->temp_image, $border_image, 0, 0, 0, 0, $temp_w, $temp_h, $opacity);
- // clean up
- imagedestroy($border_image);
- // return object
- return $this;
- }
- public function shadow($size=4, $direction=3, $colour="#444")
- //----------------------------------------------------------------------------------------------------------
- // add a shadow to an image, this will INCREASE the size of the image
- //----------------------------------------------------------------------------------------------------------
- {
- // validate we loaded a main image
- if (!$this->_check_image()) return $this;
- // if no operations, copy it for temp save
- $this->_copy_to_temp_if_needed();
- // get the current size
- $sx = imagesx($this->temp_image);
- $sy = imagesy($this->temp_image);
- // new image
- $bu_image = imagecreatetruecolor($sx, $sy);
- // check it
- if(!is_resource($bu_image))
- {
- $this->set_error('Unable to create shadow temp image sized '.$this->width.' x '.$this->height);
- return FALSE;
- }
- // copy the current image to memory
- imagecopy($bu_image, $this->temp_image, 0, 0, 0, 0, $sx, $sy);
- imagedestroy($this->temp_image);
- $this->temp_image = imagecreatetruecolor($sx+$size, $sy+$size);
- // fill background colour
- $col = $this->_html2rgb($this->background_colour);
- $bg = imagecolorallocate($this->temp_image, $col[0], $col[1], $col[2]);
- imagefilledrectangle($this->temp_image, 0, 0, $sx+$size, $sy+$size, $bg);
- // work out position
- // do X position
- switch ($direction)
- {
- // x left
- case "7":
- case "4":
- case "1":
- $sh_x = 0;
- $pic_x = $size;
- break;
- // x middle
- case "8":
- case "5":
- case "2":
- $sh_x = $size / 2;
- $pic_x = $size / 2;
- break;
- // x right
- case "9":
- case "6":
- case "3":
- $sh_x = $size;
- $pic_x = 0;
- break;
- default:
- $sh_x = $size;
- $pic_x = 0;
- $this->set_error("Shadow position $position not in vlaid range 7,8,9 - 4,5,6 - 1,2,3");
- }
- // do y position
- switch ($direction)
- {
- // y top
- case "7":
- case "8":
- case "9":
- $sh_y = 0;
- $pic_y = $size;
- break;
- // y middle
- case "4":
- case "5":
- case "6":
- $sh_y = $size / 2;
- $pic_y = $size / 2;
- break;
- // y bottom
- case "1":
- case "2":
- case "3":
- $sh_y = $size;
- $pic_y = 0;
- break;
- default:
- $sh_y = $size;
- $pic_y = 0;
- $this->set_error("Shadow position $position not in vlaid range 7,8,9 - 4,5,6 - 1,2,3");
- }
- // create the shadow
- $shadowcolour = $this->_html2rgb($colour);
- $shadow = imagecolorallocate($this->temp_image, $shadowcolour[0], $shadowcolour[1], $shadowcolour[2]);
- imagefilledrectangle($this->temp_image, $sh_x, $sh_y, $sh_x+$sx-1, $sh_y+$sy-1, $shadow);
- // copy current image to correct location
- imagecopy($this->temp_image, $bu_image, $pic_x, $pic_y, 0, 0, $sx, $sy);
- // clean up and desstroy temp image
- imagedestroy($bu_image);
- //return object
- return $this;
- }
- public function filter($function, $arg1=NULL, $arg2=NULL, $arg3=NULL, $arg4=NULL)
- //----------------------------------------------------------------------------------------------------------
- // allows you to use the inbulit gd2 image filters
- //----------------------------------------------------------------------------------------------------------
- {
- // validate we loaded a main image
- if (!$this->_check_image()) return $this;
- // if no operations, copy it for temp save
- $this->_copy_to_temp_if_needed();
- if (!imagefilter($this->temp_image, $function, $arg1, $arg2, $arg3, $arg4))
- {
- $this->set_error("Filter $function failed");
- }
- // return object
- return $this;
- }
- public function round($radius=5,$invert=False,$corners="")
- //----------------------------------------------------------------------------------------------------------
- // adds rounded corners to the output
- // using a quarter and rotating as you can end up with odd roudning if you draw a whole and use parts
- //----------------------------------------------------------------------------------------------------------
- {
- // validate we loaded a main image
- if (!$this->_check_image()) return $this;
- // if no operations, copy it for temp save
- $this->_copy_to_temp_if_needed();
- // check input
- if ($corners=="") $corners=array(True,True,True,True);
- if (!is_array($corners) || count($corners)<>4)
- {
- $this->set_error("Round failed, expected an array of 4 items round(radius,tl,tr,br,bl)");
- return $this;
- }
- // create corner
- $corner = imagecreatetruecolor($radius, $radius);
- // turn on aa make it nicer
- imageantialias($corner, true);
- $col = $this->_html2rgb($this->background_colour);
- // use bg col for corners
- $bg = imagecolorallocate($corner, $col[0], $col[1], $col[2]);
- // create our transparent colour
- $xparent = imagecolorallocate($corner, 127, 128, 126);
- imagecolortransparent($corner, $xparent);
- if ($invert)
- {
- // fill and clear bits
- imagefilledrectangle($corner, 0, 0, $radius, $radius, $xparent);
- imagefilledellipse($corner, 0, 0, ($radius * 2)-1, ($radius * 2)-1, $bg);
- }
- else
- {
- // fill and clear bits
- imagefilledrectangle($corner, 0, 0, $radius, $radius, $bg);
- imagefilledellipse($corner, $radius, $radius, ($radius * 2) , ($radius * 2) , $xparent);
- }
- // get temp widths
- $temp_w = imageSX($this->temp_image);
- $temp_h = imageSY($this->temp_image);
- // do corners
- if ($corners[0]) imagecopymerge($this->temp_image, $corner, 0, 0, 0, 0, $radius, $radius, 100);
- $corner = imagerotate($corner, 270, 0);
- if ($corners[1]) imagecopymerge($this->temp_image, $corner, $temp_w-$radius, 0, 0, 0, $radius, $radius, 100);
- $corner = imagerotate($corner, 270, 0);
- if ($corners[2]) imagecopymerge($this->temp_image, $corner, $temp_w-$radius, $temp_h-$radius, 0, 0, $radius, $radius, 100);
- $corner = imagerotate($corner, 270, 0);
- if ($corners[3]) imagecopymerge($this->temp_image, $corner, 0, $temp_h-$radius, 0, 0, $radius, $radius, 100);
- // return object
- return $this;
- }
- }
- /* End of file image_moo.php */
- /* Location: .system/application/libraries/image_moo.php */
|