Ho notato che inizialmente fai uno switch in base al tipo di immagine, mentre in seguito non lo fai
ed utilizzi solamente:

Codice PHP:
$source imagecreatefromjpeg($_FILES['image']['tmp_name']); 
Siccome tu dici:

Con le JPG tutto procede correttamente, ma se carica una GIF o una PNG, le immagini che escono sono interamente nere.
Credo che il problema sia quello.