diff --git wp-admin/includes/media.php wp-admin/includes/media.php
index 478dfdd..71c9c48 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( array( 'mime_type' => $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( array( 'mime_type' => $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..9474a44 100644
--- wp-includes/class-wp-image-editor.php
+++ wp-includes/class-wp-image-editor.php
@@ -29,14 +29,17 @@ abstract class WP_Image_Editor {
 	 * @access public
 	 *
 	 * @param string $path Path to File to Load
+	 * @param string|array $args Array of requirements.  Accepts { 'mime_type'=>string, 'methods'=>{string, string, ...} }
 	 * @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, $args = array() ) {
+		$args['path'] = $path;
+
+		$implementation = apply_filters( 'wp_image_editor_class', self::choose_implementation( $args ) );
 
 		if ( $implementation ) {
-			$editor = new $implementation( $path );
+			$editor = new $implementation( $args['path'] );
 			$loaded = $editor->load();
 
 			if ( is_wp_error( $loaded ) )
@@ -45,7 +48,7 @@ abstract class WP_Image_Editor {
 			return $editor;
 		}
 
-		return new WP_Error( 'no_editor', __('No editor could be selected') );
+		return new WP_Error( 'image_no_editor', __('No editor could be selected.') );
 	}
 
 	/**
@@ -54,32 +57,61 @@ abstract class WP_Image_Editor {
 	 * @since 3.5.0
 	 * @access private
 	 *
-	 * @param array $required_methods String array of all methods required for implementation returned.
+	 * @param array $args Array of requirements. Accepts { 'path'=>string, 'mime_type'=>string, 'methods'=>{string, string, ...} }
 	 * @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( $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 ) ) )
+			if ( isset( $args['methods'] ) &&
+				 array_diff( $args['methods'], get_class_methods( $editor ) ) ) {
 				continue;
+			}
 
 			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|array $args Array of requirements.  Accepts { 'path'=>string, 'mime_type'=>string, 'methods'=>{string, string, ...} }
+	 * @return boolean true if an eligible editor is found; false otherwise
+	 */
+	public final static function supports( $args = array() ) {
+		return ( (bool) self::choose_implementation( $args ) );
+	}
+
+	/**
 	 * Loads image from $this->file into editor.
 	 *
 	 * @since 3.5.0
@@ -168,7 +200,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
 	 */
diff --git wp-includes/deprecated.php wp-includes/deprecated.php
index 9e99614..5b841df 100644
--- wp-includes/deprecated.php
+++ wp-includes/deprecated.php
@@ -3328,4 +3328,38 @@ function user_pass_ok($user_login, $user_pass) {
  * @since 2.3.0
  * @deprecated 3.5.0
  */
-function _save_post_hook() {}
\ No newline at end of file
+function _save_post_hook() {}
+
+/**
+ * Check if the installed version of GD supports particular image type
+ *
+ * @since 2.9.0
+ * @deprecated 3.5.0
+ * @see WP_Image_Editor::supports()
+ *
+ * @param string $mime_type
+ * @return bool
+ */
+function gd_edit_image_support($mime_type) {
+	_deprecated_function( __FUNCTION__, '3.5', 'WP_Image_Editor::supports()' );
+	if ( function_exists('imagetypes') ) {
+		switch( $mime_type ) {
+			case 'image/jpeg':
+				return (imagetypes() & IMG_JPG) != 0;
+			case 'image/png':
+				return (imagetypes() & IMG_PNG) != 0;
+			case 'image/gif':
+				return (imagetypes() & IMG_GIF) != 0;
+		}
+	} else {
+		switch( $mime_type ) {
+			case 'image/jpeg':
+				return function_exists('imagecreatefromjpeg');
+			case 'image/png':
+				return function_exists('imagecreatefrompng');
+			case 'image/gif':
+				return function_exists('imagecreatefromgif');
+		}
+	}
+	return false;
+}
\ No newline at end of file
diff --git wp-includes/media.php wp-includes/media.php
index bafb0a4..5f9385d 100644
--- wp-includes/media.php
+++ wp-includes/media.php
@@ -902,37 +902,6 @@ function get_taxonomies_for_attachments( $output = 'names' ) {
 }
 
 /**
- * Check if the installed version of GD supports particular image type
- *
- * @since 2.9.0
- *
- * @param string $mime_type
- * @return bool
- */
-function gd_edit_image_support($mime_type) {
-	if ( function_exists('imagetypes') ) {
-		switch( $mime_type ) {
-			case 'image/jpeg':
-				return (imagetypes() & IMG_JPG) != 0;
-			case 'image/png':
-				return (imagetypes() & IMG_PNG) != 0;
-			case 'image/gif':
-				return (imagetypes() & IMG_GIF) != 0;
-		}
-	} else {
-		switch( $mime_type ) {
-			case 'image/jpeg':
-				return function_exists('imagecreatefromjpeg');
-			case 'image/png':
-				return function_exists('imagecreatefrompng');
-			case 'image/gif':
-				return function_exists('imagecreatefromgif');
-		}
-	}
-	return false;
-}
-
-/**
  * Create new GD image resource with transparency support
  * @TODO: Deprecate if possible.
  *
