Image_moo
Image_Moo is currently at version 1.0.0 – 7th Dec 2010
The CI library for image manipulation is great, but I found it awkward to use when doing multiple processes. So I wrote my own library which I’m happy for you to play with and send feedback. It is limited to PHP 5 and GD2 only, sorry, but that suits my needs.
Install
Copy the unzipped file to /system/application/libraries for CI > 1.7.2 and /application/libraries for CI 2.
Functions
load($x) - Loads a base image as specified by $x - JPG, PNG, GIF supported. This is then used for all processing and is kept in memory till complete
save($x,$overwrite=FALSE) - Saved the manipulated image (if applicable) to file $x - JPG, PNG, GIF supported. If overwrite is not set file write may fail. The file saved will be dependant on processing done to the image, or a simple copy if nothing has been done.
save_dynamic($filename="") - Saves as a stream output, use filename to return png/jpg/gif etc., default is jpeg
save_pa($prepend="", $append="", $overwrite=FALSE) - Saves the file using the original location and filename, however it adds $prepend to the start of the filename and adds $append to the end of the filename. e.g. if your original file was /this/that/file.jpg you can use save_pe("pre_", "_app", TRUE) to save it as /this/that/pre_file_app.jpg
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 current background colour (set_background_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, unless you have done the calculations this will distort the image
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 watermark image using your text and specified ttf font file.
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
shadow($size=4, $direction=3, $colour="#444") - Add a basic shadow to the image. Size in pixels, note that the image will increase by this size, so resize(400,400)->shadow(4) will give an image 404 pixels in size, Direction works on the keypad basis like the watermark, so 3 is bottom right, 7 top left, $color if the colour of the shadow.
border($width,$colour="#000") - Draw a border around the output image X pixels wide in colour specified. This can be used multiple times, e.g. $this->image_moo->border(6,"#fff")->border(1,"#000") creates a photo type of border
border_3d($width,$rot=0,$opacity=30) - Creates 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. This functions masks the corners to created a rounded edge effect.
Image helper functions
display_errors($open = '<p>', $close = '</p>') - Display errors as Ci standard style. Example if ($this->image_moo->error) print $this->image_moo->display_errors();
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() - Use to clear all loaded images form memory
Examples
All the examples here will use the image as shown on the right hand side (click to expand) and we will use the save_dynamic output instead of saving as a file. Of course all the examples are missing 2 bits of common code, to reduce space used. Before image_moo works, you need to load it with $this->load->library(“image_moo”);, and after running a function you should check for errors and report as needed. if($this->image_moo->error) print $this->image_moo->display_errors();.
Cropping
The following section shows the various ways Image_moo can crop and resize an image
Simple crop
Image is cropped to a max in either axis of 100 pixels, output image will be the same ratio as the input image
$this->image_moo
->load("DSC01707.JPG")
->resize(100,100)
->save_dynamic()
Crop keep proportions but outputting a fixed size
Image is cropped as above, but the output is padded to fit the specified size. Please note I set a funny background colour for visual reasons only
$this->image_moo
->load('DSC01707.JPG')
->set_background_colour("#49F")
->resize(100,100,TRUE)
->save_dynamic();
Resize with crop
Image is resized to an exact size based on cropping a ratio match from the original image
$this->image_moo
->load('DSC01707.JPG')
->resize_crop(100,100)
->save_dynamic();

Borders
In these examples we will add various borders to the output image
Simple photo style border
$this->image_moo
->load('DSC01707.JPG')
->resize_crop(100,100)
->border(5, "#ffffff")
->border(1, "#000000")
->save_dynamic();
Rounded corners
Note that the background colour used can be set with the set_background_colour command, we have left it white for this example.
$this->image_moo
->load('DSC01707.JPG')
->resize_crop(100,100)
->round(5)
->save_dynamic();
3d effect
$this->image_moo
->load('DSC01707.JPG')
->resize_crop(100,100)
->border_3d(5)
->save_dynamic();

Watermarking
You can also apply watermarks to your images!
Using an image
$this->image_moo
->load('DSC01707.JPG')
->load_watermark("matmoo.gif")
->resize(400,400)
->watermark(5)
->save_dynamic();
Using your own text
$this->image_moo
->load('DSC01707.JPG')
->make_watermark_text("MatMoo.com", "DANUBE__.TTF", 25, "#000")
->resize(400,400)
->watermark(2)
->save_dynamic();

Conclusion
As you can see this library is much easier to use than that default Image_lib that comes with CI, especially when it comes to mulitple picture outputs. For example; once an image is loaded you can run multiple commands and saves on it $this->image_moo->load(“image.jpg”)->resize(600,600)->save(“large.jpg”)->resize(400,400)->save(“medium.jpg”)->resize(100,100)->save(“small.jpg”) and of course you can add watermarks after each resize (or borders) as well.
Todo
Rotated text fix box size
Changelog
1.0.1: 13th Dec 2010, Fixed watermark text after changes to images, it got broken (oops)
1.0.0: 7th Dec 2010, Change the way the watermarks are applied using a suggested fix from the PHP help docs on imagecopy,merge page
0.9.9b: 10th Nov 2010, Modify resize routine calculation, thanks Cole
0.9.9a : 17th Oct 2010, Another pa save bug!
0.9.9 : 1st Oct 2010, added shadow system
0.9.3 : 10th Sep 2010, bug fix in save_pa thanks to Matjaz
0.9.2 : 26th Aug 2010, fixed an error with set background colour (stupid cut and paste error!)
0.9.2 : 26th Aug 2010, added a couple of additional defaults for round and border


about 1 week ago
Hey, just wanted to say thanks, this library rocks
about 3 months ago
Hello Mat,
First of all I want to thank you for your great plugin
I have been using it on a project before and it works just fine.
I am currently trying to resize transparent PNGs but I get a black background and the transparency is lost….
Any clue on what to change to allow transparent PNGs resizing ?
about 3 months ago
I found a fix for my issue !
Just added two lines at line 545 after:
$this->temp_image = imagecreatetruecolor($tx,$ty);
Here is the code:
imagealphablending( $this->temp_image, false);
imagesavealpha( $this->temp_image, true);
about 3 months ago
Thanks for that – I need to spend some time improving png transparency all around
about 6 months ago
Justo lo que andaba buscando para mis aplicaciones, funciona a la perfección. Thanks!
about 6 months ago
It’s working now. I changed the code on codeigniters forum solution.
I just changed $this->width and $this->height for $tx and $ty
This is how the code should look on lines 555 to 560
about 6 months ago
Yep, I need to make an update, sorry
about 7 months ago
Hey, just wanted to say thanks for this library. I’ve used it in the past for a big B2B e-commerce project and now I’m using it for one of my smaller personal projects.
All the best,
Joseph
about 7 months ago
Your welcome! Donations welcome
about 7 months ago
Hello,
i am tried to load a simple image
class image extends CI_Controller {
function index(){
$this->load->library(“image_moo”);
$this->image_moo
->load(“/../imagini/r.jpg”)
->resize(100,100);
if($this->image_moo->errors)
print $this->image_moo->display_errors();
}
}
but i have a error “Could not locate file”.
I am created a folder “imagini” where is the main folders(application and system). I gave the path “/../imagini/r.jpg” and nothing . Can give me a solution .
Thank you ,
about 7 months ago
The path will depend on your config, I can’t tell you what it will be. You could user $_SERVER["document_root"] to get teh correct root folder of the website and append the path to that.
about 7 months ago
Hello again ,
i have the same error:
i am tried this
….
$path= base_url().’imagini/r.jpg’;
$this->load->library(“image_moo”);
$this->image_moo->load($path)
…..
/// Could not locate file http://localhost:8080/cc/imagini/r.jpg
The path is correct but i do not understand why does not work.
Thank you ,
about 7 months ago
I’m not sure what to say, that error is set with http://php.net/manual/en/function.file-exists.php so maybe it’s a safe mode restriction?
about 7 months ago
the folder where i have saved image have permission 777?
about 7 months ago
Any solution ?
about 7 months ago
The problem is yours not mine, I’ve told you the code it’s failing on, it’s a standard php function. If that fails then I suggest you have a problem, but it is NOT the fault of image_moo. If you want full support then you can communicate via email and pay for support, but the issue is yours not mine.
about 6 months ago
Thank you , i did it
about 6 months ago
Care to share your solution?
about 6 months ago
Hello,
public function index() {
$file_path=’1.jpg’;
$this->test($file_path);
}
public function test($file_path) {
$this->load->library(‘image_moo’);
$fonts=’mailrays.ttf’;
$this->image_moo
->load(‘image/’ . $file_path)
->make_watermark_text(“MERGE TARE ?”, ‘fonts/’.$fonts, 20, “#160000″,10)
->resize(700,700)
->watermark(2)
->save_pa(”, ‘_thumb’, TRUE);
return $this->image_moo->errors;
}
The name folder “image” was created in the root.
about 7 months ago
thanks for Image moo realy easy
about 7 months ago
Thank you so much. This library is very useful for me.
about 7 months ago
Hi!
I’m trying to just load an image and the apache error log gives me this: PHP Fatal error: Call to a member function load() on a non-object in /home/niko/Documents/lamko/app/views/crop.php on line 6, referer: http://localhost/
What could cause this?
My crop.php is just
load->library(“image_moo”);
$this->image_moo
->load(‘/var/www/test.jpg’);
?>
Thanks!
about 7 months ago
$this->load->library(“image_moo”);
about 7 months ago
Thanks, now I feel stupid
about 7 months ago
I believe there’s a bug on line 670;
$col = $this->_html2rgb($$this->background_colour); <-$$this
about 7 months ago
Fixed, ta!
about 7 months ago
Hi, how to save in custom directories ?
about 7 months ago
Save(‘/custom folder/name.jpg’);
about 7 months ago
Hi, i’m having trouble by using your library. After loading the library I get ‘Undefined property: Image_moo::$error’, not being able to see the actual error of why My image is not being resized. I just copyied the example an it’s throwing this… any idea?
about 7 months ago
Line number or anything? there is no error, only errors which is an array.
about 8 months ago
Thx man, I will wait for new version! Great job!
about 8 months ago
Hi there, im trying use the save_dinamic, but i only see squads, how i proceed?
Thx again
about 8 months ago
I replied to your post on the CI forums
about 8 months ago
Thx, the saga continues there!! ^^
Rly thks man.
about 9 months ago
Very good stuff ! Thanks for this good library.
about 9 months ago
Hi
I’ve downloaded the library, but I’m getting errors when loading from a view
$this->load->library(“image_moo”);
$this->image_moo->load(“../images/img01.jpg”);
A PHP Error was encountered
Severity: Notice
Message: Undefined property: CI_Loader::$image_moo
Filename: views/vista_datos_cuenta.php
Line Number: 270
about 9 months ago
Sorry for the delay (See my post about not being able to access WP-Admin!)
In CI you don’t normally do work in the view itself, the view is just that. What are you trying to achieve?
about 11 months ago
Thank you for this super library! I found it on Google, and it is exactly what I am looking for.
Thanks again!
about 11 months ago
Im getting “Function ereg_replace() is deprecated” when i do
$this->image_moo->check_gd();
Am I doing something wrong?
about 11 months ago
Yep, fixed for the next release, will try and get it on tonight
about 11 months ago
Great library mate. Saved plenty of time!!!
about 11 months ago
This library looks pretty good – I was looking for something like this but with a bit more functionality (flip horizontal, vertical, text with stroke). Would you consider putting the library on github so that I (and others) can fork it, make changes and send you any pull requests for you to review?
about 11 months ago
Adding flip is pretty easy, just never had a need for it myself
In terms of text with stroke, is that for watermarking? For now I’d rather keep the library hosted on here, you are free to do what you want with it though.
about 11 months ago
Thanks very much for this library – just one question, can it retain PNG transparency after resizing?
about 11 months ago
Not sure, why don’t you try it out and let me know
On another note I have a small update I need to upload soon.
about 8 months ago
I have tried this out and it doesn’t seem to work each resized png with transparency gets a black background.
Also trying to reset the background to white I still get a background colour of black
Great library but would be great if you could work in support for this.
about 8 months ago
I have made some improvements on this, but I haven’t had time to finish testing it. The black background is due to the alpha channel and the code not correctly processing alpha channels (mostly I use it for jpegs). I’m rather constrained for time at present, but I will at some point put an improved version up.
about 8 months ago
PS See http://codeigniter.com/forums/viewthread/161469/P40/#886580
about 11 months ago
Greatjob dude. Keep it up.
about 1 year ago
this is a nice library, can i use this outside CI?
about 1 year ago
I’ve not tried, but I don’t think it would take too much to get it work outside of CI.
about 1 year ago
Thank you very much, amazing job…
about 1 year ago
hi !! I have a question
i need to crop image + make shadow + curve image
but your lib create image crop image buy shadow not curve
please help me Y Y
about 1 year ago
Well you would need to crop->curve->shadow, but with the current code the shadows are restricted to square only. I do have an idea on how to improve this, but not the time to implement it at the moment, sorry.
about 1 year ago
I guess you could, it just seems kind of strange
about 1 year ago
What’s strange is that you are pointing out a flaw that isn’t even one.
about 1 year ago
Great work!!
One thing this Library really needs is the ability to have it resize() to just the width or just the height.
Basically the way this works is you have resize(200,0) so what it is saying is that it will NOT try to match the height, it will only focus on matching the width (and constrain proportions). Here is a script that uses this idea http://tech.mikelopez.info/2006/03/02/php-image-resize-script/
about 1 year ago
Could you not just call resize(200,9999) should cover most options?
about 1 year ago
This is simply amazing! I have a quick question. For the padded crop, is there a way we can only add padding to one direction of the image (e.g., add padding to the right of an image)? I’m trying to add a one sided pad and a watermark on the right of an image.
Thanks!
about 1 year ago
Hmmmm. Would it not be better to just resize then pad as needed using css?
about 1 year ago
Hi,
i have problem with image quality after saving :
$this->image_moo ->load($upload_path . $file_name)
->load_watermark(“wm.png”) ->set_jpeg_quality(100)
->watermark(3,TRUE)
->save($original_path . $file_name);
i set set_jpeg_quality to 100, but the result is same image quality and bad wotermark quality …
how to set watermark image quality to 100%.
Thanks in advance and sorry for my bad english
about 1 year ago
Hi Pavel,
Can you send me a copy of the files to play with? (I’ll email you)
Mat
about 1 year ago
First off thanks for the library, it is a great improvement on the default CI library and saves us a ton of time.
One thing I noticed when I ran a pretty fringe case was I don’t think you calculate the new dimensions quite correctly int he resize method On line 511 you check to see if the image width is greater than the image height. If it is then you use the crop width as the new width. However this doesn’t always yield the proper results take for instance this example:
max_h = 200
max_w = 1000
image_h = 300
image_w = 400
new_h = 750
new_w = 1000
however if you change line 511 to check the ratio to decide which should be max you will always keep it within the bounds of max width and max height
if( $this->width / $this->height > $mw / $mh ) {
about 1 year ago
Good spot, I’ll test that out and update! Would of course need some odd parameters for this to happen but it is possible
about 1 year ago
The way I was running it I wanted to make sure it only resized based on width so I had set the height to a ridiculously high number. Thats really the only way I can think of it happening.
about 1 year ago
good job man..
ur library saved my time!
thanks
about 1 year ago
Your welcome!
about 1 year ago
Hi, how can I crop image, if i have only 2 coordinates: x_axis and y_axis in CI´s Image Manipulation Class. image_moo requires 4 parametres: x1,x2,y1,y2. Thank you.
about 1 year ago
CI Image lib also requires 4 params, X, Y, Width, Height… So crop($x,$y,$x+$width,$y+$height)
about 1 year ago
Where on earth $newfile came from, I have no idea! LOL, thanks
Glad you like it.
about 1 year ago
The save_pa function is still broken. The error is now in line 237:
Original:
$this->save($newfile,$parts["dirname"].’/’.$prepend.$parts['filename'].$append.’.’.$parts["extension"], $overwrite);
..should be:
$this->save($parts["dirname"].’/’.$prepend.$parts['filename'].$append.’.’.$parts["extension"], $overwrite);
Anyway, great lib and works like a charm(after the bugfix)
about 1 year ago
Really good library, thanks
about 1 year ago
This looks excellent! Thanks!
Although I found a minor bug in save_pa function. Line 233 should probably say:
$this->save($parts["dirname"].’/’.$prepend.$parts['filename'].$append.’.’.$parts["extension"],$overwrite);
about 1 year ago
Thanks, fixed and will upload soon.