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.
I have uploaded some more GD example code here
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.
I have uploaded some more GD example code here
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.
<?php
// 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
$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:
<?php
// 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
This code was to demonstrate the speed test differences.
<?php
// 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:
<?php
// 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
<?php
$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
<?php
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
The rotation of the text would not work; I assume you need
to save an extra tempory image and rotate that.
<?php
$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
#
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.
<?php
$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 like; you can then
save it as any image type you want and not worry about wether it is a
jpg, png, pdf etc.
No comments:
Post a Comment