wp_get_image_mime()WP 4.7.1

Gets the real MIME type of an image file.

We can't trust to the image type in the image name, for example png image can be called image.jpg.

PHP functions are used to accurately determine mime:

1 time — 0.135771 sec (extremely slow) | 50000 times — 176.48 sec (extremely slow) | PHP 7.1.11, WP 4.9.4

No Hooks.

Return

String|false. The actual mime type or false if the type cannot be determined.

Usage

wp_get_image_mime( $file );
$file(string) (required)
Full path to the file.

Examples

0

#1 Get the mime type of the image in the template files (screenshot of the theme)

$screenshot_path = get_template_directory() . '/screenshot.png';
echo wp_get_image_mime( $screenshot_path );
//> image/png

Changelog

Since 4.7.1 Introduced.
Since 5.8.0 Added support for WebP images.

wp_get_image_mime() code WP 6.4.3

function wp_get_image_mime( $file ) {
	/*
	 * Use exif_imagetype() to check the mimetype if available or fall back to
	 * getimagesize() if exif isn't available. If either function throws an Exception
	 * we assume the file could not be validated.
	 */
	try {
		if ( is_callable( 'exif_imagetype' ) ) {
			$imagetype = exif_imagetype( $file );
			$mime      = ( $imagetype ) ? image_type_to_mime_type( $imagetype ) : false;
		} elseif ( function_exists( 'getimagesize' ) ) {
			// Don't silence errors when in debug mode, unless running unit tests.
			if ( defined( 'WP_DEBUG' ) && WP_DEBUG
				&& ! defined( 'WP_RUN_CORE_TESTS' )
			) {
				// Not using wp_getimagesize() here to avoid an infinite loop.
				$imagesize = getimagesize( $file );
			} else {
				$imagesize = @getimagesize( $file );
			}

			$mime = ( isset( $imagesize['mime'] ) ) ? $imagesize['mime'] : false;
		} else {
			$mime = false;
		}

		if ( false !== $mime ) {
			return $mime;
		}

		$magic = file_get_contents( $file, false, null, 0, 12 );

		if ( false === $magic ) {
			return false;
		}

		/*
		 * Add WebP fallback detection when image library doesn't support WebP.
		 * Note: detection values come from LibWebP, see
		 * https://github.com/webmproject/libwebp/blob/master/imageio/image_dec.c#L30
		 */
		$magic = bin2hex( $magic );
		if (
			// RIFF.
			( str_starts_with( $magic, '52494646' ) ) &&
			// WEBP.
			( 16 === strpos( $magic, '57454250' ) )
		) {
			$mime = 'image/webp';
		}
	} catch ( Exception $e ) {
		$mime = false;
	}

	return $mime;
}