Rubblewebs

THESE CODES ARE PROVIDED FOR AN EXAMPLE OF HOW TO USE IMAGEMAGICK WITH PHP. CARE SHOULD BE TAKEN WHEN ACCEPTING USER INPUT.

I TAKE NO RESPONSABILTY FOR ANY PROBLEMS THAT MAY OCCURE WHEN USING ANY OF THIS CODE.

IT IS UP TO YOU TO SECURE THE CODE AND VALIDATE USER INPUT.

Some comparisons between ImageMagick and GD

While in discussion on a forum the speed of GD against ImageMagick came up and I tried a couple of speed tests.

With the examples below the flower image resize was twice as fast in ImageMagick 0.083450 seconds against 0.160992 seconds in GD. But the text generation image was 35 times faster in GD 0.003110 seconds as apposed to 0.119943 seconds in ImageMagick.
I am told that if you use one of the other ImageMagick API's they are faster.

In reality unless you are doing a lot of processing you are not really going to notice the difference.

I have looked into this a bit further and found that if you are doing a small amount of large image conversions it is quicker to use ImageMagick than GD. If you are doing a lot of smaller image conversions it is better to use GD. This seems to be due to the extra time involved using exec( ). Things can be speed up if you use an API like Imagick.

GD Icon I have uploaded some more GD example code.

GD

Image resized using GD

You will notice that the ImageMagick code has retained the "aspect ratio" whereas the GD code has resized the image to 100x100.

To get GD to keep the aspect ratio you would have to do some more calculations on the original image size.

// Temporary upload image name
$original_image = '../original_images/flowers.jpg';
// Get the image dimensions
$size=GetImageSize( $original_image );
// Maximum image width
$max_width = "100";
// Maximum image height
$max_height = "100";
// Resize the image and sav
$src_img = ImageCreateFromJPEG( $original_image );
$thumbnail = ImageCreateTrueColor( $max_width, $max_height );
ImageCopyResampled( $thumbnail, $src_img, 0, 0, 0, 0, $max_width, $max_height, $size[0],$size[1] );
ImageJPEG( $thumbnail, 'flowers_GD.jpg' );
ImageDestroy( $thumbnail );

To keep the aspect ratio based on the original image width:

// Temporary upload image name
$original_image = '../original_images/flowers.jpg';
// Get the image dimensions
$size=GetImageSize( $original_image );
// Maximum image width
$max_width = '100';
// Maximum image height
//$max_height = '100';
$ratio = 100/$size[0];
$max_height = $size[1]*$ratio;
// Resize the image and save		
$src_img = ImageCreateFromJPEG( $original_image );
$thumbnail = ImageCreateTrueColor( $max_width, $max_height );
ImageCopyResampled( $thumbnail, $src_img, 0, 0, 0, 0, $max_width, $max_height, $size[0],$size[1] );
ImageJPEG( $thumbnail, 'flowers_GD.jpg' );
ImageDestroy( $thumbnail );

ImageMagick

Image resized using ImageMagick

This code was to demonstrate the speed test differences.

// Temporary upload image name
$original_image = '../original_images/flowers.jpg';
// Get the image dimensions
$size=GetImageSize( $original_image );
// Maximum image width
$max_width = '100';
// Maximum image height
$max_height = '100';
// Resize the image and save
exec("convert -size {$size[0]}x{$size[1]} $original_image -thumbnail {$max_width}x{$max_height} flowers_IM.jpg");

The code can be reduced to this:

// Temporary upload image name
$original_image = '../original_images/flowers.jpg';
// Maximum image width
$max_width = '100';
// Maximum image height
$max_height = '100';
// Resize the image and save
exec("convert $original_image -thumbnail {$max_width}x{$max_height} flowers_IM.jpg");


GD

Image created containing some text with GD

$canvas = imagecreate( 200, 100 );
$black = imagecolorallocate( $canvas, 0, 0, 0 );
$white = imagecolorallocate( $canvas, 255, 255, 255 );
imagefilledrectangle( $canvas, 9, 9, 189, 89, $white );
$font = 'verdana.ttf';
$text = 'Title';
$size = '30';
$box = imageftbbox( $size, 0, $font, $text );
$x = (200 - ($box[2] - $box[0])) / 2;
$y = (100 - ($box[1] - $box[7])) / 2;
$y -= $box[7];
imageTTFText( $canvas, $size, 0, $x, $y, $black, $font, $text );
imagejpeg( $canvas, "Label_GD.jpg" );
ImageDestroy( $canvas );

ImageMagick

Image created containing some text with ImageMagick

exec("convert -background white -fill black -pointsize 30 -font verdana.ttf -gravity Center -size 180x80 label:$text -mattecolor black -frame 10x10+0+0 Label_IM.jpg");

GD

An image watermarked with text using GD

The rotation of the text would not work; I assume you need to save an extra temporary image and rotate that.

$canvas = imagecreate( 200, 100 ); 
$black = imagecolorallocate( $canvas, 0, 0, 0 ); 
$white = imagecolorallocate( $canvas, 255, 255, 255 ); 
imagefilledrectangle( $canvas, 0, 0, 200, 100, $white ); 
$font = '../fonts/verdana.ttf'; 
$text = 'Sunflower'; 
$size = '30'; 
$degrees = '30'; 
$photo= '../original_images/sunflower.jpg';
$box = imagettfbbox( $size, 0, $font, $text ); 
$x = (200 - ($box[2] - $box[0])) / 2; 
$y = (100 - ($box[1] - $box[7])) / 2; 
$y -= $box[7]; 
imageTTFText( $canvas, $size, 0, $x, $y, $black, $font, $text ); 
imagecolortransparent ( $canvas, $white ); 
imagerotate( $canvas, $degrees, 0); 
imagepng( $canvas, 'temp.png' ); 
ImageDestroy( $canvas ); 
$watermark = imagecreatefrompng('temp.png');   
$watermark_width = imagesx($watermark);   
$watermark_height = imagesy($watermark);   
$image = imagecreatetruecolor($watermark_width, $watermark_height);   
$image = imagecreatefromjpeg($photo);   
$size = getimagesize($photo);   
$dest_x = $size[0] - $watermark_width - 100;   
$dest_y = $size[1] - $watermark_height - 200;   
imagecopymerge($image, $watermark, $dest_x, $dest_y, 0, 0, $watermark_width, $watermark_height, 50);   
imagejpeg($image, 'watermark_GD.jpg');   
imagedestroy($image);   
imagedestroy($watermark);   
unlink( 'temp.png');  

ImageMagick

An image watermarked with text using ImageMagick

As the rotate text did not work for GD I have left it off from this example as well.
It is quite easy to rotate the text on ImageMagic you just alter the -annotate operator	
	
$font = '../fonts/verdana.ttf'; 
$text = 'Sunflower'; 
$size = '40'; 
$degrees = '30'; 
$photo= '../original_images/sunflower.jpg';
exec("convert $photo -font $font -pointsize $size -fill rgba\(0,0,0,0.4\) -gravity north -annotate +0+25 $text watermark_IM.jpg");


An other good thing about Imagemagick is it supports a lot more image types. Unlike GD where you have to use imagecreatefromjpeg for jpg's and imagecreatefrompng for png's etc. you can give the same line of code any image type; you can then save it as any image type you want and not worry about whether it is a jpg, png, pdf etc.