wp_get_image_mime()WP 4.7.1

Возвращает реальный mime-тип изображения.

Типу изображения в названии доверять нельзя, например, png изображение можно назвать как image.jpg.

Для точного определения mime используются PHP функции:

  • exif_imagetype() - определение типа изображения;
  • image_type_to_mime_type() - получение mime-типа для типа изображения, возвращаемого функциями getimagesize, exif_read_data, exif_thumbnail, exif_imagetype;
  • getimagesize() - получение размера изображения.

Используется в функции wp_check_filetype_and_ext();

1 раз — 0.135771 сек (тормоз) | 50000 раз — 176.48 сек (тормоз) | PHP 7.1.11, WP 4.9.4

Хуков нет.

Возвращает

Строку|false. Актуальный mime-тип или false, если определить не удалось.

Использование

wp_get_image_mime( $file );
$file(строка) (обязательный)
Полный путь к файлу (изображению).

Примеры

0

#1 Получим mime-тип у картинки в файлах шаблона (скриншота темы)

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

Список изменений

С версии 4.7.1 Введена.
С версии 5.8.0 Added support for WebP images.
С версии 6.5.0 Added support for AVIF images.
С версии 6.7.0 Added support for HEIC images.

Код wp_get_image_mime() WP 7.0

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 = $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';
		}

		/**
		 * Add AVIF fallback detection when image library doesn't support AVIF.
		 *
		 * Detection based on section 4.3.1 File-type box definition of the ISO/IEC 14496-12
		 * specification and the AV1-AVIF spec, see https://aomediacodec.github.io/av1-avif/v1.1.0.html#brands.
		 */

		// Divide the header string into 4 byte groups.
		$magic = str_split( $magic, 8 );

		if ( isset( $magic[1] ) && isset( $magic[2] ) && 'ftyp' === hex2bin( $magic[1] ) ) {
			if ( 'avif' === hex2bin( $magic[2] ) || 'avis' === hex2bin( $magic[2] ) ) {
				$mime = 'image/avif';
			} elseif ( 'heic' === hex2bin( $magic[2] ) ) {
				$mime = 'image/heic';
			} elseif ( 'heif' === hex2bin( $magic[2] ) ) {
				$mime = 'image/heif';
			} else {
				/*
				 * HEIC/HEIF images and image sequences/animations may have other strings here
				 * like mif1, msf1, etc. For now fall back to using finfo_file() to detect these.
				 */
				if ( extension_loaded( 'fileinfo' ) ) {
					$fileinfo  = finfo_open( FILEINFO_MIME_TYPE );
					$mime_type = finfo_file( $fileinfo, $file );

					if ( PHP_VERSION_ID < 80100 ) { // finfo_close() has no effect as of PHP 8.1.
						finfo_close( $fileinfo );
					}

					if ( wp_is_heic_image_mime_type( $mime_type ) ) {
						$mime = $mime_type;
					}
				}
			}
		}
	} catch ( Exception $e ) {
		$mime = false;
	}

	return $mime;
}