diff --git a/includes/media.filter.inc b/includes/media.filter.inc
index 4ce41aa..77be956 100644
--- a/includes/media.filter.inc
+++ b/includes/media.filter.inc
@@ -388,6 +388,17 @@ function media_get_file_without_label($file, $view_mode, $settings = array()) {
   // element attributes.
   if (!isset($element['#attributes']) && isset($settings['attributes'])) {
     $element['#attributes'] = $settings['attributes'];
+
+    // While this function may be called for any file type, images are a common
+    // use-case. theme_image() and theme_image_style() require the 'alt'
+    // attribute to be passed separately from the 'attributes' array (see
+    // http://drupal.org/node/999338). Until that's fixed, implement this
+    // special-case logic. Image formatters using other theme functions are
+    // responsible for their own 'alt' attribute handling. See
+    // theme_media_formatter_large_icon() for an example.
+    if (isset($settings['attributes']['alt']) && !isset($element['#alt']) && isset($element['#theme']) && in_array($element['#theme'], array('image', 'image_style'))) {
+      $element['#alt'] = $settings['attributes']['alt'];
+    }
   }
 
   return $element;
diff --git a/includes/media.theme.inc b/includes/media.theme.inc
index 84855ce..f449577 100644
--- a/includes/media.theme.inc
+++ b/includes/media.theme.inc
@@ -321,5 +321,10 @@ function theme_media_formatter_large_icon($variables) {
   $icon_dir = media_variable_get('icon_base_directory') . '/' . media_variable_get('icon_set');
   $icon = file_icon_path((object)$file, $icon_dir);
   $variables['path'] = $icon;
+  // theme_image() requires the 'alt' attribute passed as its own variable.
+  // @see http://drupal.org/node/999338
+  if (!isset($variables['alt']) && isset($variables['attributes']['alt'])) {
+    $variables['alt'] = $variables['attributes']['alt'];
+  }
   return theme('image', $variables);
 }
