Image type to extension: примеры (PHP)

Преобразование типа изображения в расширение файла в PHP
Раздел: Работа с изображениями
image_type_to_extension(int $image_type, bool $include_dot = true): string|false

Описание функции image_type_to_extension

Функция image_type_to_extension() в PHP возвращает строку, содержащую стандартное расширение файла для заданного типа изображения. Она применяется при обработке графических файлов, когда известен числовой идентификатор типа изображения (например, полученный из функции getimagesize() или exif_imagetype()), но требуется получить соответствующее расширение для сохранения файла или формирования имени.

Аргументы функции

Функция принимает два параметра:

  • $image_type (int) — константа типа изображения. Обычно это одна из предопределенных констант IMAGETYPE_* (например, IMAGETYPE_JPEG, IMAGETYPE_PNG).
  • $include_dot (bool) — необязательный аргумент. Если задан как true (значение по умолчанию), возвращаемая строка будет начинаться с точки. Если false, точка в начале расширения отсутствует.

Функция возвращает строку с расширением (например, '.jpg') или false в случае, если передан неизвестный тип изображения.

Краткие примеры использования

Пример 1: Получение расширения с точкой
<?
echo image_type_to_extension(IMAGETYPE_JPEG);
?>
.jpg
Пример 2: Получение расширения без точки
<?
echo image_type_to_extension(IMAGETYPE_PNG, false);
?>
png
Пример 3: Неизвестный тип изображения
<?
$result = image_type_to_extension(100);
var_dump($result);
?>
bool(false)
Пример 4: Работа с различными типами
<?
$types = [IMAGETYPE_GIF, IMAGETYPE_WEBP, IMAGETYPE_BMP];
foreach ($types as $type) {
    echo image_type_to_extension($type) . "\n";
}
?>
.gif
.webp
.bmp

Похожие функции в PHP

Прямых аналогов функции image_type_to_extension() в PHP нет. Однако, существуют функции для определения типа изображения, которые могут использоваться в сочетании с ней:

  • getimagesize() — возвращает массив с информацией об изображении, включая тип. Можно извлечь тип и передать его в image_type_to_extension(). Используется, когда нужны дополнительные данные (ширина, высота).
  • exif_imagetype() — определяет тип изображения быстрее, чем getimagesize(), так как читает только начальные байты файла. Предпочтительнее для быстрой проверки типа.
  • pathinfo() — возвращает информацию о пути к файлу, включая расширение. Применяется, когда известно имя файла, а не тип изображения в виде константы.

Функцию image_type_to_extension() выбирают, когда уже получен числовой идентификатор типа и требуется преобразовать его в строковое расширение.

Альтернативы в других языках

Python (библиотека Pillow)

В Python нет встроенной функции, но с помощью библиотеки Pillow можно определить формат изображения и преобразовать его в расширение.

from PIL import Image

try:
    img = Image.open('image.jpg')
    format = img.format
    extension = f'.{format.lower()}'
    print(extension)
except Exception as e:
    print('Ошибка:', e)
.jpeg
JavaScript (в среде Node.js)

В JavaScript на стороне сервера можно использовать пакет image-type для определения типа изображения по буферу.

const imageType = require('image-type');
const fs = require('fs');

const buffer = fs.readFileSync('image.png');
const type = imageType(buffer);
if (type) {
    console.log(`.${type.ext}`);
} else {
    console.log('Неизвестный тип');
}
.png

Image type to extension в MySQL

В MySQL нет прямой аналогичной функции для работы с типами изображений. Обычно расширения файлов хранятся как строки в таблицах, а проверка осуществляется на уровне приложения.

Типичные ошибки

Ошибка 1: Передача несуществующего типа

При передаче числового значения, не соответствующего ни одной константе IMAGETYPE_*, функция вернет false.

<?
$result = image_type_to_extension(999);
if ($result === false) {
    echo 'Неизвестный тип изображения';
}
?>
Неизвестный тип изображения
Ошибка 2: Неправильный тип аргумента

Функция ожидает целочисленный аргумент. Передача строки может привести к неожиданному поведению из-за автоматического приведения типов.

<?
// Не рекомендуется
echo image_type_to_extension('2');
?>
.jpeg
Ошибка 3: Использование без проверки возвращаемого значения

Если не проверять, что функция вернула false, это может привести к ошибкам при формировании имени файла.

<?
$type = 99; // Неизвестный тип
$extension = image_type_to_extension($type);
// Без проверки:
echo 'Файл: image' . $extension;
?>
Файл: image

Изменения в последних версиях PHP

В PHP 8.0.0 было изменено возвращаемое значение функции для неизвестных типов изображений. Ранее функция возвращала пустую строку '', теперь возвращается false. Это изменение улучшает обработку ошибок, но требует обновления кода, который полагался на старую логику.

<?
// В PHP 7.x:
// image_type_to_extension(999) возвращало ''
// В PHP 8.x:
var_dump(image_type_to_extension(999));
?>
bool(false)

Расширенные примеры

Пример 1: Обработка массива типов изображений

Функция может использоваться для преобразования массива типов в список расширений.

Пример php
<?
$imageTypes = [
    IMAGETYPE_JPEG => 'JPEG Image',
    IMAGETYPE_PNG => 'PNG Image',
    IMAGETYPE_WEBP => 'WebP Image'
];

foreach ($imageTypes as $type => $description) {
    $ext = image_type_to_extension($type, false);
    echo "$description имеет расширение: $ext\n";
}
?>
JPEG Image имеет расширение: jpg
PNG Image имеет расширение: png
WebP Image имеет расширение: webp
Пример 2: Генерация имени файла с уникальным идентификатором

Создание имени файла на основе типа изображения и временной метки.

Пример php
<?
$detectedType = exif_imagetype('uploaded_image.tmp');
if ($detectedType) {
    $extension = image_type_to_extension($detectedType);
    $filename = 'image_' . time() . $extension;
    echo "Сгенерированное имя файла: $filename";
}
?>
Сгенерированное имя файла: image_1641234567.jpg
Пример 3: Фильтрация файлов по допустимым типам

Проверка, относится ли тип изображения к списку разрешенных.

Пример php
<?
$allowedTypes = [IMAGETYPE_JPEG, IMAGETYPE_PNG];
$uploadedType = IMAGETYPE_WEBP;

$extension = image_type_to_extension($uploadedType, false);
if (in_array($uploadedType, $allowedTypes)) {
    echo "Тип $extension разрешен.";
} else {
    echo "Тип $extension не поддерживается.";
}
?>
Тип webp не поддерживается.
Пример 4: Использование с пользовательской константой

Хотя функция ожидает стандартные константы, можно передавать и числовые значения, если они корректны.

Пример php
<?
// Константа IMAGETYPE_TIFF_MM (тип TIFF) имеет значение 2
$tiffExtension = image_type_to_extension(2);
echo "Расширение для типа 2: $tiffExtension";
?>
Расширение для типа 2: .tiff
Пример 5: Логирование информации о изображении

Запись в лог данных о типе изображения и его расширении.

Пример php
<?
$file = 'photo.bmp';
$type = exif_imagetype($file);
if ($type) {
    $ext = image_type_to_extension($type);
    error_log("Файл $file имеет тип $type и расширение $ext");
}
?>
// В логе: Файл photo.bmp имеет тип 6 и расширение .bmp

PHP image_type_to_extension function comments

En
Image type to extension Get file extension for image type