Write an application page or web part that creates the new site. Programmatically update it with what users enter in your custom form.
Creating the site
The SPWebCollection.Add() method creates the site from a site definition. Create a custom definition that includes the site columns, content types and lists required. These will then be created as part of the site.
Further customisations
This won't perform all customisations however - for the rest develop a feature receiver. On activation it will run any arbitrary code on your new site.
For example as you are using a publishing site, retrieve its default page with the DefaultPage property. This is an SPFile object which has an Item property that can be edited like any other SPListItem. Update the image field and description field for the item based on its content type. The page will then render these properties.
All of the above can be wrapped in an SPLongOperation for a nicer user experience.
There are other options as well, for example the SPWebProvisioningProvider. The two separate steps above of creating a site definition and activating a feature receiver could be tied into one with this.
There is more information on the above techniques (plus others) and their pros and cons in part 3 and part 4 of this series by Raymond Mitchell.