Output both form and generated image (imagejpeg) onto same page
If you put $form_state['rebuild'] = TRUE in your submit handler then the form's redisplayed and you have access to $form_state['values'] in the form constructor. This is typically how multi-step forms are done. So in this case something like:

if (empty($form_state['values']['user_name'])) {
  $form['user_name'] = array(
    '#title' =&gt; t('Your Name'),
    '#type' =&gt; 'textfield',
    '#description' =&gt; t('Please enter your name.'),
  );
  $form['submit'] = array(
    '#type' =&gt; 'submit',
    '#value' =&gt; t('Submit')
  );
}
else {
  $form['image'] = array(
    '#theme' =&gt; 'image__nameform',
    '#path' =&gt; $path,
    '#width' =&gt; $width,
    '#height' =&gt; $height,
    '#alt' =&gt; $form_state['values']['user_name'],
  );
}


To pass the name to your image generation function you want to change its entry in hook_menu(): the path should be image/% (which says there's an argument), page callback create_textimage (because that's what generates the content) and page arguments array(1) (because the text is the second argument, and you start numbering at 0). There are more details in the documentation for hook_menu().

A few other points not directly related to the Q:


Currently the image generation function is a bit of a DOS vector (because it's a bit CPU intensive, isn't cached, doesn't require auth, and doesn't require a form submission).
You should use drupal_set_message(t('Thanks for adding your name, %name.', array('%name' =&gt; $name));. This is secure and translatable - see t() and format_string().
The function names are a bit all over the place. If your module's called frameyourname then all your functions should start with that (with a few exceptions). Also I'd suggest avoiding a path like image/% in favour of something more specific like frameyourname/%.