diff --git a/src/wp-admin/includes/image.php b/src/wp-admin/includes/image.php
index 139d405..e85c20f 100644
--- a/src/wp-admin/includes/image.php
+++ b/src/wp-admin/includes/image.php
@@ -259,7 +259,7 @@ function wp_read_image_metadata( $file ) {
 	if ( ! file_exists( $file ) )
 		return false;
 
-	list( , , $sourceImageType ) = getimagesize( $file );
+	$sourceImageType = wp_get_image_type( $file );
 
 	/*
 	 * EXIF contains a bunch of data we'll probably never need formatted in ways
@@ -430,6 +430,33 @@ function wp_read_image_metadata( $file ) {
 }
 
 /**
+ * Get the type of an image.
+ *
+ * This is the constant value for the image type, pass to
+ * image_type_to_mime_type() to get the mime type.
+ *
+ * @param string $path File path to the image
+ * @return int|false Image Type constant value for the image type, false on failure
+ */
+function wp_get_image_type( $path ) {
+	if ( is_callable( 'exif_imagetype' ) ) {
+		return @exif_imagetype( $path );
+	}
+
+	/**
+	 * In the case of exif_imagetype not being available, we use the
+	 * slower more network heavy getimagesize
+	 */
+	$size = @getimagesize( $file );
+
+	if ( ! $size ) {
+		return false;
+	}
+
+	return $size[2];
+}
+
+/**
  * Validate that file is an image.
  *
  * @since 2.5.0
@@ -453,14 +480,7 @@ function file_is_valid_image($path) {
 function file_is_displayable_image($path) {
 	$displayable_image_types = array( IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG, IMAGETYPE_BMP );
 
-	$info = @getimagesize( $path );
-	if ( empty( $info ) ) {
-		$result = false;
-	} elseif ( ! in_array( $info[2], $displayable_image_types ) ) {
-		$result = false;
-	} else {
-		$result = true;
-	}
+	$result = in_array( wp_get_image_type( $path ), $displayable_image_types );
 
 	/**
 	 * Filter whether the current image is displayable in the browser.
diff --git a/src/wp-includes/functions.php b/src/wp-includes/functions.php
index e3fb353..90d3c0c 100644
--- a/src/wp-includes/functions.php
+++ b/src/wp-includes/functions.php
@@ -2181,13 +2181,12 @@ function wp_check_filetype_and_ext( $file, $filename, $mimes = null ) {
 	}
 
 	// We're able to validate images using GD
-	if ( $type && 0 === strpos( $type, 'image/' ) && function_exists('getimagesize') ) {
+	if ( $type && 0 === strpos( $type, 'image/' ) ) {
 
-		// Attempt to figure out what type of image it actually is
-		$imgstats = @getimagesize( $file );
+		$image_mime_type = wp_get_image_type( $file );
 
-		// If getimagesize() knows what kind of image it really is and if the real MIME doesn't match the claimed MIME
-		if ( !empty($imgstats['mime']) && $imgstats['mime'] != $type ) {
+		// If the real MIME doesn't match the claimed MIME
+		if ( $image_mime_type != $type ) {
 			/**
 			 * Filter the list mapping image mime types to their respective extensions.
 			 *
@@ -2204,10 +2203,10 @@ function wp_check_filetype_and_ext( $file, $filename, $mimes = null ) {
 			) );
 
 			// Replace whatever is after the last period in the filename with the correct extension
-			if ( ! empty( $mime_to_ext[ $imgstats['mime'] ] ) ) {
+			if ( ! empty( $mime_to_ext[ $image_mime_type ] ) ) {
 				$filename_parts = explode( '.', $filename );
 				array_pop( $filename_parts );
-				$filename_parts[] = $mime_to_ext[ $imgstats['mime'] ];
+				$filename_parts[] = $mime_to_ext[ $image_mime_type ];
 				$new_filename = implode( '.', $filename_parts );
 
 				if ( $new_filename != $filename ) {
diff --git a/tests/phpunit/tests/image/functions.php b/tests/phpunit/tests/image/functions.php
index 9cc3f09..ed03810 100644
--- a/tests/phpunit/tests/image/functions.php
+++ b/tests/phpunit/tests/image/functions.php
@@ -351,4 +351,26 @@ class Tests_Image_Functions extends WP_UnitTestCase {
 		remove_filter( 'wp_image_editors', array( $this, 'mock_image_editor' ) );
 		WP_Image_Editor_Mock::$save_return = array();
 	}
+
+	public function test_wp_get_image_type() {
+
+		$image_paths = array(
+			DIR_TESTDATA . '/images/test-image.jpg' => IMAGETYPE_JPEG,
+			DIR_TESTDATA . '/images/test-image.png' => IMAGETYPE_PNG,
+			DIR_TESTDATA . '/images/test-image.tiff' => IMAGETYPE_TIFF_MM,
+			DIR_TESTDATA . '/images/test-image.jp2' => IMAGETYPE_JP2,
+			DIR_TESTDATA . '/images/test-image.bmp' => IMAGETYPE_BMP,
+			DIR_TESTDATA . '/images/test-image.gif' => IMAGETYPE_GIF,
+		);
+
+		foreach ( $image_paths as $image_path => $type ) {
+			// use getimagesize as a comparison, as it needs to be compatibile
+			$info = getimagesize( $image_path );
+			$this->assertEquals( $info[2], wp_get_image_type( $image_path ), 'getimagesize() returns different result for ' . $image_path );
+
+			$this->assertEquals( $type, wp_get_image_type( $image_path ), 'Image type incorrect for ' . $image_path );
+		}
+
+		$this->assertEquals( false, wp_get_image_type( '/some/broken/path' ) );
+	}
 }
