I've done this myself.
Use the imagecopyresized function.
Here's the basic logic:
Get the big image loaded in PHP.
Create a small image of the same aspect (so it looks cool)
Copy the big image onto the small image (using the imagecopyresized function)
save the small image.
I made a page which automatically generates thumbnails for photos, and saves them on my server:
http://www.joliet.co.uk/browse
I hope that helps.
Dave