PDA

View Full Version : Help! PHP / GD thumbnail creation


Subway
2005-11-23, 05:31 PM
Can anyone see anything wrong with this code?


function do_thumbs( $fn ){
$img_src = "../rep_pics/large/$fn";

$med_height = 250;
$med_width = 200;
$med_dest = "../rep_pics/medium/$fn";

$sml_height = 125;
$sml_width = 100;
$sml_dest = "../rep_pics/small/$fn";

$src_height = ImageSY($img_src);
$src_width = ImageSX($img_src);

$med_source_handle = imageCreateFromJPEG($img_src);
if(!$med_source_handle){ die("couldn't get the source handle - $img_src"); }
$med_image = imageCreateTrueColor( $med_width, $med_height );
imageCopyResampled($med_image, $med_source_handle, 0, 0, 0, 0, $med_width, $med_height, $src_width, $src_height );
imageJPEG($med_image, $med_dest, 90);
chmod($img_src, 0777);
imageDestroy($med_image);

$sml_source_handle = imageCreateFromJPEG($img_src);
if(!$sml_source_handle){ die("couldn't get the source handle - $img_src"); }
$sml_image = imageCreateTrueColor( $sml_width, $sml_height );
imageCopyResampled($sml_image, $sml_source_handle, 0, 0, 0, 0, $sml_width, $sml_height, $src_width, $src_height );
imageJPEG($sml_image, $sml_dest, 90);
chmod($img_src, 0777);
imageDestroy($sml_image);
}


It's supposed to create two thumbnails given a source image, and it gets as far as creating and even writing the images, but they're just pure black pictures. I've looked over it 1000 times, looked at a dozen tutorials, but can't seem to find where the hangup is. I suppose it would have to be in the imageCopyResampled, but all the function arguments are what they are supposed to be so I'm at a loss. Any help would be greatly appreciated!

Subway

oast
2005-11-24, 04:24 AM
Subway
In my (little) experience with GD, this is usually due to a corrupt (or less than perfect) image file.
Have you tried other images from different sources?
Is there any indication in the php error log (assuming you have one)?

oast
2005-11-24, 07:08 AM
Would have edited previous message, but option was not there as it was a "Quick Reply"

Any way, I played with this and moved the imageCreateFromJPEG function above the image sizing functions. Also used full paths.

So try this:
function do_thumbs( $fn ){
$img_src = "/home/user/rep_pics/large/".$fn;

$med_height = 250;
$med_width = 200;
$med_dest = "/home/user/rep_pics/medium/".$fn;

$sml_height = 125;
$sml_width = 100;
$sml_dest = "/home/user/rep_pics/small/".$fn;

$med_source_handle = imageCreateFromJPEG($img_src);
if(!$med_source_handle){ die("couldn't get the source handle - $img_src"); }
$sml_source_handle = imageCreateFromJPEG($img_src);
if(!$sml_source_handle){ die("couldn't get the source handle - $img_src"); }

$src_height = ImageSY($med_source_handle);
$src_width = ImageSX($med_source_handle);
$med_image = imageCreateTrueColor( $med_width, $med_height );
imageCopyResampled($med_image, $med_source_handle, 0, 0, 0, 0, $med_width, $med_height, $src_width, $src_height );
imageJPEG($med_image, $med_dest, 90);
chmod($img_src, 0777);
imageDestroy($med_image);
imageDestroy($med_source_handle);

$src_height = ImageSY($sml_source_handle);
$src_width = ImageSX($sml_source_handle);
$sml_image = imageCreateTrueColor( $sml_width, $sml_height );
imageCopyResampled($sml_image, $sml_source_handle, 0, 0, 0, 0, $sml_width, $sml_height, $src_width, $src_height );
imageJPEG($sml_image, $sml_dest, 90);
chmod($img_src, 0777);
imageDestroy($sml_image);
imageDestroy($sml_source_handle);
}

Subway
2005-11-24, 11:16 AM
Ya I got it figured out finally. My host had error messages turned off so it was a pain in the ass to figure out.. I finally got GD set up right on my local test bed and it all started making sense |thumb. Here's the 'finished' code if anyone ever needs it.


function do_thumbs( $fn ){
$img_src = "../rep_pics/large/$fn";

$med_height = 250;
$med_width = 200;
$med_dest = "../rep_pics/medium/".$fn;

$sml_height = 125;
$sml_width = 100;
$sml_dest = "../rep_pics/small/".$fn;

$source_handle = imageCreateFromJPEG($img_src);
$src_height = ImageSY($source_handle);
$src_width = ImageSX($source_handle);

$med_image = imageCreateTrueColor( $med_width, $med_height );
imageCopyResampled($med_image, $source_handle, 0, 0, 0, 0, $med_width, $med_height, $src_width, $src_height );
imageJPEG($med_image, $med_dest, 90);
chmod($med_dest, 0777);
imageDestroy($med_image);

$sml_image = imageCreateTrueColor( $sml_width, $sml_height );
imageCopyResampled($sml_image, $source_handle, 0, 0, 0, 0, $sml_width, $sml_height, $src_width, $src_height );
imageJPEG($sml_image, $sml_dest, 90);
chmod($sml_dest, 0777);
imageDestroy($sml_image);
}

oast
2005-11-24, 11:07 PM
One quick question...

Why are you making the final thumbnails world writable and executable? (chmod 777)?

Subway
2005-11-25, 12:02 AM
Because when theyre created by php they're owned by apache and I cannot delete or rename them via FTP. I have a tendancy to change my mind about stuff all the time so I tend to run in to situations where I need to do something with them... no other reason.

tickler
2005-11-25, 08:23 PM
I use basically the same code. Only difference is that I use imageCopy() instead of inmageCopyResampled().

oast
2005-11-26, 12:08 PM
I use basically the same code. Only difference is that I use imageCopy() instead of inmageCopyResampled().Doesn't imageCopyResampled() give better results when resizing an image?


Just noticed this:imageJPEG($sml_image, $sml_dest, 90);Why use 90% on thumbnails when web/JPEG default is 75?

In response to your earlier reply:
chown(new_image, username);