1) Si cuando te refieres a "carge" el usuario una imagen te refieres a que ha de subir tu imagen tu usuario por un formulario desde su PC al servidor .. sobre tu pregunta 1 .. en principio podrías tomar esa imagen del "temporal" (directorio) que PHP deja los archivos que suben por HTTP (por tu formulario) y usar esa ruta ($_FILES['imagen']['tmp_name']) para aplicarla a la función(es) GD que corresponda(n) .. Si tienes problemas sobre permisos de acceso a esa ruta directamente o por hacer un script más compatible con ciertas configuraciones "seguras" de PHP (safe_mode a ON) .. lo ideal es que copies tu archivo (imagen) vía move_uploaded_file() hacia un directorio de tu sitio y ahí trabajes ese archivo . .si luego no requieres para nada más esa imagen "origen"; la borras (unlink()).
2) .. En el foro tienes ejemplos de creación de "thumbnails" donde veras la técnica de "re-escalar" una imagen y procesarla. También tienes ejemplos en al documentación oficial de las funciones de gráficos para PHP con GD:
www.php.net/gd
La mayoría de ejemplos usan más bien proporciones o definen tamaño fijo de salida (en alto o en ancho o ambas) .. Pero, hacer un "%" es sólo cosa de que apliques algo de matemáticas.
Un saludo,