Getimagesize: примеры (PHP)

Использование getimagesize() для получения информации об изображениях
Раздел: Работа с изображениями
getimagesize(string $filename, array &$image_info = null): array|false

Функция getimagesize в PHP

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

Аргументы функции
  • $filename (string) - Путь к анализируемому файлу изображения.
  • &$image_info (array) (необязательный) - Ссылка на массив, в который будет помещена дополнительная информация из файла изображения (например, каналы, bits, mime, а также данные APP из JPEG).
Возвращаемое значение

Функция возвращает массив с индексами от 0 до 3 или false в случае ошибки.

  • [0] - Ширина изображения в пикселях.
  • [1] - Высота изображения в пикселях.
  • [2] - Одна из констант IMAGETYPE_XXX, указывающая тип изображения.
  • [3] - Строка, готовая для использования в HTML-атрибуте width="..." height="...".
  • ['mime'] - MIME-тип изображения.

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

Базовый пример
<?php
$image_info = getimagesize('nature.jpg');
if($image_info !== false) {
    echo '<pre>';
    print_r($image_info);
    echo '</pre>';
} else {
    echo 'Файл не является изображением.';
}
?>
Array
(
    [0] => 800
    [1] => 600
    [2] => 2
    [3] => width="800" height="600"
    [mime] => image/jpeg
)
Пример с дополнительной информацией
<?php
$image_info = getimagesize('photo.jpg', $info);
echo "Ширина: " . $image_info[0] . "<br>";
echo "Высота: " . $image_info[1] . "<br>";
echo "Тип: " . image_type_to_extension($image_info[2]) . "<br>";
echo "MIME: " . $image_info['mime'] . "<br>";
echo "HTML строка: " . $image_info[3] . "<br>";
if(isset($info['APP13'])) {
    echo "Обнаружены IPTC данные.";
}
?>
Ширина: 1920
Высота: 1080
Тип: .jpg
MIME: image/jpeg
HTML строка: width="1920" height="1080"

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

imagesx() / imagesy()

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

<?php
$img = imagecreatefrompng('image.png');
$width = imagesx($img);
$height = imagesy($img);
?>
exif_imagetype()

Функция определяет тип изображения быстрее, чем getimagesize(), так как читает только первые байты файла. Возвращает константу IMAGETYPE_XXX или false. Полезна для валидации типа без чтения всей информации о размере.

finfo_file()

Функция из расширения Fileinfo может определить MIME-тип любого файла, а не только изображения. Используется, когда нужно универсальное решение.

Аналоги в других языках

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

Модуль PIL.Image предоставляет метод open() и атрибуты size, format.

from PIL import Image
img = Image.open('nature.jpg')
print(f'Размер: {img.size}')
print(f'Формат: {img.format}')
print(f'Цветовой режим: {img.mode}')
Размер: (800, 600)
Формат: JPEG
Цветовой режим: RGB
JavaScript (в браузере)

Для получения размеров изображения, уже загруженного в DOM, используют свойства naturalWidth и naturalHeight.

<img id="myImage" src="nature.jpg" alt="Nature">
<script>
    const img = document.getElementById('myImage');
    img.onload = function() {
        console.log(`Ширина: ${this.naturalWidth}, Высота: ${this.naturalHeight}`);
    };
</script>
Node.js (пакет sharp или image-size)
const sizeOf = require('image-size');
sizeOf('nature.jpg', (err, dimensions) => {
    if (err) throw err;
    console.log(dimensions); // { width: 800, height: 600, type: 'jpg' }
});

Getimagesize в MySQL

Прямых аналогов для работы с изображениями внутри СУБД обычно нет. Метаданные изображений могут извлекаться на уровне приложения, а не базы данных.

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

Ошибка при отсутствии файла или прав доступа
<?php
$info = getimagesize('non_existent_file.jpg');
var_dump($info);
?>
Warning: getimagesize(non_existent_file.jpg): failed to open stream: No such file or directory in ...
bool(false)

Перед вызовом функции стоит проверять существование файла с помощью file_exists() или отключать предупреждения оператором @ и анализировать возвращаемое значение на false.

Ошибка при анализе некорректного изображения

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

Неверная интерпретация результатов
<?php
$info = getimagesize('image.gif');
$width = $info[0]; // Корректно
$mime = $info['mime']; // Корректно
$channels = $info['channels']; // Может отсутствовать, если изображение не поддерживает каналы (например, GIF).
?>

Перед обращением к опциональным элементам массива, таким как 'channels' или 'bits', следует использовать проверку isset().

Изменения в PHP 8

В PHP 8.0 были внесены следующие изменения, связанные с getimagesize():

  • Улучшена обработка ошибок: Некоторые фатальные ошибки преобразованы в исключения типа ValueError или TypeError. Однако для самой функции основным способом индикации ошибки остается возврат false.
  • Строгая типизация: При включенном режиме строгой типизации передача аргумента неверного типа (например, массива вместо строки) вызовет исключение TypeError.

В PHP 8.1 и 8.2 существенных изменений в поведении функции не отмечалось.

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

Определение ориентации изображения
Пример php
<?php
function getImageOrientation($filePath) {
    $info = getimagesize($filePath);
    if (!$info) return false;
    [$width, $height] = $info;
    if ($width > $height) return 'landscape';
    if ($width < $height) return 'portrait';
    return 'square';
}
echo getImageOrientation('wide.jpg'); // landscape
?>
Валидация загружаемого изображения
Пример php
<?php
function validateUploadedImage($tmpFilePath) {
    $allowedTypes = [IMAGETYPE_JPEG, IMAGETYPE_PNG, IMAGETYPE_GIF];
    $info = getimagesize($tmpFilePath);
    if (!$info) return 'Файл не является изображением.';
    if (!in_array($info[2], $allowedTypes)) return 'Допустимы только JPG, PNG и GIF.';
    if ($info[0] > 5000 || $info[1] > 5000) return 'Размер изображения слишком большой.';
    return true; // Валидация пройдена
}
?>
Получение IPTC данных
Пример php
<?php
$info = getimagesize('photo_with_iptc.jpg', $image_info);
if (isset($image_info['APP13'])) {
    $iptc = iptcparse($image_info['APP13']);
    echo 'Заголовок: ' . ($iptc['2#105'][0] ?? 'Не указан') . '<br>';
    echo 'Ключевые слова: ' . implode(', ', $iptc['2#025'][0] ?? []) . '<br>';
}
?>
Определение размера для SVG (векторной графики)

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

Пример php
<?php
$info = @getimagesize('image.svg');
if ($info && $info['mime'] == 'image/svg+xml') {
    echo 'Это SVG.';
} else {
    echo 'SVG не поддерживается или файл поврежден.';
}
?>
Пакетная обработка изображений в директории
Пример php
<?php
$imageSizes = [];
foreach (glob('uploads/*.{jpg,jpeg,png,gif,webp}', GLOB_BRACE) as $file) {
    $info = getimagesize($file);
    if ($info) {
        $imageSizes[basename($file)] = [
            'width' => $info[0],
            'height' => $info[1],
            'mime' => $info['mime']
        ];
    }
}
print_r($imageSizes);
?>

PHP getimagesize function comments

En
Getimagesize Get the size of an image