diff --git wp-admin/includes/media.php wp-admin/includes/media.php
index 478dfdd..3aeda34 100644
--- wp-admin/includes/media.php
+++ wp-admin/includes/media.php
@@ -1122,7 +1122,7 @@ function get_media_item( $attachment_id, $args = null ) {
 	$media_dims = apply_filters( 'media_meta', $media_dims, $post );
 
 	$image_edit_button = '';
-	if ( gd_edit_image_support( $post->post_mime_type ) ) {
+	if ( WP_Image_Editor::supports( $post->post_mime_type ) ) {
 		$nonce = wp_create_nonce( "image_editor-$post->ID" );
 		$image_edit_button = "<input type='button' id='imgedit-open-btn-$post->ID' onclick='imageEdit.open( $post->ID, \"$nonce\" )' class='button' value='" . esc_attr__( 'Edit Image' ) . "' /> <span class='spinner'></span>";
 	}
@@ -2259,7 +2259,7 @@ function edit_form_image_editor() {
 	$att_url = wp_get_attachment_url( $post->ID );
 
 	$image_edit_button = '';
-	if ( gd_edit_image_support( $post->post_mime_type ) ) {
+	if ( WP_Image_Editor::supports( $post->post_mime_type ) ) {
 		$nonce = wp_create_nonce( "image_editor-$post->ID" );
 		$image_edit_button = "<input type='button' id='imgedit-open-btn-$post->ID' onclick='imageEdit.open( $post->ID, \"$nonce\" )' class='button' value='" . esc_attr__( 'Edit Image' ) . "' /> <span class='spinner'></span>";
 	}
diff --git wp-includes/class-wp-image-editor-gd.php wp-includes/class-wp-image-editor-gd.php
index ca76006..c52735a 100644
--- wp-includes/class-wp-image-editor-gd.php
+++ wp-includes/class-wp-image-editor-gd.php
@@ -100,9 +100,17 @@ class WP_Image_Editor_GD extends WP_Image_Editor {
 	 * @return boolean
 	 */
 	public static function supports_mime_type( $mime_type ) {
-		$allowed_mime_types = array( 'image/gif', 'image/png', 'image/jpeg' );
+		$image_types = imagetypes();
+		switch( $mime_type ) {
+			case 'image/jpeg':
+				return ($image_types & IMG_JPG) != 0;
+			case 'image/png':
+				return ($image_types & IMG_PNG) != 0;
+			case 'image/gif':
+				return ($image_types & IMG_GIF) != 0;
+		}
 
-		return in_array( $mime_type, $allowed_mime_types );
+		return false;
 	}
 
 	/**
@@ -261,7 +269,7 @@ class WP_Image_Editor_GD extends WP_Image_Editor {
 	 * @since 3.5.0
 	 * @access public
 	 *
-	 * @param boolean $horz Horizonal Flip
+	 * @param boolean $horz Horizontal Flip
 	 * @param boolean $vert Vertical Flip
 	 * @returns boolean|WP_Error
 	 */
diff --git wp-includes/class-wp-image-editor-imagick.php wp-includes/class-wp-image-editor-imagick.php
index 601b99b..0edcde0 100644
--- wp-includes/class-wp-image-editor-imagick.php
+++ wp-includes/class-wp-image-editor-imagick.php
@@ -147,11 +147,11 @@ class WP_Image_Editor_Imagick extends WP_Image_Editor {
 	 * @return boolean
 	 */
 	public static function supports_mime_type( $mime_type ) {
-		if ( ! $mime_type )
-			return false;
-
 		$imagick_extension = strtoupper( self::get_extension( $mime_type ) );
 
+		if ( ! $imagick_extension )
+			return false;
+
 		try {
 			return ( (bool) Imagick::queryFormats( $imagick_extension ) );
 		}
@@ -312,7 +312,7 @@ class WP_Image_Editor_Imagick extends WP_Image_Editor {
 	 * @since 3.5.0
 	 * @access public
 	 *
-	 * @param boolean $horz Horizonal Flip
+	 * @param boolean $horz Horizontal Flip
 	 * @param boolean $vert Vertical Flip
 	 * @returns boolean|WP_Error
 	 */
diff --git wp-includes/class-wp-image-editor.php wp-includes/class-wp-image-editor.php
index 920e4a4..83b214f 100644
--- wp-includes/class-wp-image-editor.php
+++ wp-includes/class-wp-image-editor.php
@@ -32,8 +32,13 @@ abstract class WP_Image_Editor {
 	 * @param array $required_methods Methods to require in implementation
 	 * @return WP_Image_Editor|WP_Error
 	 */
-	public final static function get_instance( $path = null, $required_methods = null ) {
-		$implementation = apply_filters( 'wp_image_editor_class', self::choose_implementation( $required_methods ), $path );
+	public final static function get_instance( $path = null, $required_methods = array() ) {
+		$implementation = apply_filters( 'wp_image_editor_class',
+			self::choose_implementation(
+				$required_methods,
+				array( 'path' => $path )
+			)
+		);
 
 		if ( $implementation ) {
 			$editor = new $implementation( $path );
@@ -57,18 +62,31 @@ abstract class WP_Image_Editor {
 	 * @param array $required_methods String array of all methods required for implementation returned.
 	 * @return string|bool Class name for the first editor that claims to support the request. False if no editor claims to support the request.
 	 */
-	private final static function choose_implementation( $required_methods = null ) {
+	private final static function choose_implementation( $required_methods = array(), $args = array() ) {
 		$request_order = apply_filters( 'wp_image_editors',
 			array( 'WP_Image_Editor_Imagick', 'WP_Image_Editor_GD' ) );
 
-		if ( ! $required_methods )
-			$required_methods = array();
+		if ( ! isset( $args['mime_type'] ) && isset( $args['path'] ) ) {
+			$file_info  = wp_check_filetype( $args['path'] );
+
+			// If $file_info['type'] is false, then we let the editor attempt to
+			// figure out the file type, rather than forcing a failure based on extension.
+			if ( isset( $file_info ) && $file_info['type'] )
+				$args['mime_type'] = $file_info['type'];
+		}
 
 		// Loop over each editor on each request looking for one which will serve this request's needs
 		foreach ( $request_order as $editor ) {
 			// Check to see if this editor is a possibility, calls the editor statically
-			if ( ! call_user_func( array( $editor, 'test' ) ) )
+			if ( ! call_user_func( array( $editor, 'test' ), $args ) )
+				continue;
+
+			if ( isset( $args['mime_type'] ) &&
+				! call_user_func(
+					array( $editor, 'supports_mime_type' ),
+					$args['mime_type'] ) ) {
 				continue;
+			}
 
 			// Make sure that all methods are supported by editor.
 			if ( array_diff( $required_methods, get_class_methods( $editor ) ) )
@@ -76,10 +94,25 @@ abstract class WP_Image_Editor {
 
 			return $editor;
 		}
+
 		return false;
 	}
 
 	/**
+	 * Tests whether there is an editor that supports a given mime type or methods.
+	 *
+	 * @since 3.5.0
+	 * @access public
+	 *
+	 * @param string $mime_type Mime type to check for compatibility
+	 * @param array $required_methods String array of all methods required
+	 * @return boolean true if an eligible editor is found; false otherwise
+	 */
+	public final static function supports( $mime_type = null, $required_methods = array() ) {
+		return ( (bool) self::choose_implementation( $required_methods, array( 'mime_type' => $mime_type ) ) );
+	}
+
+	/**
 	 * Loads image from $this->file into editor.
 	 *
 	 * @since 3.5.0
@@ -168,7 +201,7 @@ abstract class WP_Image_Editor {
 	 * @access public
 	 * @abstract
 	 *
-	 * @param boolean $horz Horizonal Flip
+	 * @param boolean $horz Horizontal Flip
 	 * @param boolean $vert Vertical Flip
 	 * @return boolean|WP_Error
 	 */
