Как определить высоту фото в PHP

Раздел: Веб-разработка -> Работа с изображениями

Основные способы получения высоты изображения в PHP

Как максимально быстро и без лишних затрат памяти получить высоту изображения?

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


$file = 'photo.jpg';
$size = getimagesize($file);
$height = $size[1];
echo "Высота: $height";

Типичная ошибка: попытка передать несуществующий файл или файл не изображение. В таком случае функция возвращает false и генерирует предупреждение. Для избежания ошибки нужно проверять результат:


if ($size = getimagesize($file)) {
    $height = $size[1];
} else {
    echo 'Не удалось определить высоту';
}

Также можно передать URL (если включена директива allow_url_fopen). Однако для удалённых файлов функция может работать медленно.

Как получить высоту изображения через библиотеку GD?

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


$img = imagecreatefromjpeg('photo.jpg');
$height = imagesy($img);
echo "Высота: $height";
imagedestroy($img);

Проблема: требуется полная загрузка изображения в память. Для больших файлов это может привести к превышению лимита memory_limit. Решение - использовать getimagesize() для предварительной проверки или ограничивать размер через GD.

Применяется, когда необходимо также выполнить манипуляции с изображением (изменение размера, наложение водяного знака).

Как узнать высоту изображения с помощью Imagick?

Расширение Imagick предоставляет объектно-ориентированный интерфейс. Для получения высоты используется метод getImageHeight().


$imagick = new Imagick('photo.jpg');
$height = $imagick->getImageHeight();
echo "Высота: $height";
$imagick->clear();

Ошибка: если не установлено расширение Imagick, скрипт упадёт. Рекомендуется проверять наличие класса: if (class_exists('Imagick')) {...}

Imagick поддерживает более 100 форматов и корректно обрабатывает повёрнутые изображения (автоматически учитывает EXIF ориентацию).

Как извлечь высоту из метаданных EXIF?

Для JPEG и TIFF изображений можно прочитать EXIF-данные функцией exif_read_data(). Она возвращает массив, содержащий, в том числе, высоту (ключ COMPUTED.Height). Однако высота может быть записана с учётом ориентации.


$exif = exif_read_data('photo.jpg');
$height = $exif['COMPUTED']['Height'] ?? $exif['COMPUTED']['Height'];
echo "Высота: $height";

Сложность: EXIF данные отсутствуют у многих форматов (PNG, GIF). Функция работает только для JPEG/TIFF. Также если изображение повёрнуто, в EXIF может быть указана исходная высота до поворота. Для точного определения нужно учитывать тег Orientation.

Полезно, если требуется получить также другую метаинформацию (дата съёмки, модель камеры).

Как получить высоту из строки base64 или потока?

Если изображение передаётся в виде base64-строки, можно сначала декодировать её и использовать imagecreatefromstring() или getimagesizefromstring().


$base64 = 'data:image/png;base64,iVBORw0KGgo...';
$data = base64_decode(substr($base64, strpos($base64, ',')+1));
$size = getimagesizefromstring($data);
$height = $size[1];
echo "Высота: $height";

Ошибка: большой объём base64-строки может превысить лимит памяти. Лучше проверять размер до декодирования.

Используется при работе с загружаемыми через AJAX изображениями или API.

Ниже приведены расширенные примеры с пояснением каждого шага и результатом.

Пример 1: получение высоты удалённого изображения через cURL

Когда allow_url_fopen отключён, можно скачать заголовки изображения через cURL и передать в getimagesizefromstring.

Пример

$url = 'https://example.com/photo.jpg';
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_MAXREDIRS, 3);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
$data = curl_exec($ch);
if (curl_errno($ch)) {
    echo 'Ошибка cURL: ' . curl_error($ch);
} else {
    $size = getimagesizefromstring($data);
    if ($size) {
        echo "Высота: {$size[1]}";
    } else {
        echo 'Не удалось определить размер';
    }
}
curl_close($ch);
Высота: 768

Пример 2: получение высоты с учётом EXIF ориентации

У повёрнутых JPEG изображений фактическая высота может отличаться от EXIF. Imagick автоматически корректирует, но для GD нужно вручную.

Пример

$file = 'rotated.jpg';
$exif = exif_read_data($file);
$orientation = $exif['IFD0']['Orientation'] ?? 1;
$size = getimagesize($file);
$width = $size[0];
$height = $size[1];
// Если ориентация требует поворота на 90 или 270 градусов, меняем местами
if (in_array($orientation, [5,6,7,8])) {
    $height = $size[0];
    $width = $size[1];
}
echo "Высота (с учётом ориентации): $height";
Высота (с учётом ориентации): 480

Пример 3: получение высоты изображения, переданного через форму (multipart)

Пример

if ($_FILES['image']['error'] === UPLOAD_ERR_OK) {
    $tmp = $_FILES['image']['tmp_name'];
    $size = getimagesize($tmp);
    if ($size) {
        echo "Высота загруженного файла: {$size[1]}";
    }
}
Высота загруженного файла: 1080

Пример 4: получение высоты из потока PHP (php://input)

При POST запросе с Content-Type image/jpeg можно прочитать тело запроса.

Пример

$input = fopen('php://input', 'rb');
$meta = stream_get_meta_data($input);
$data = stream_get_contents($input);
fclose($input);
$size = getimagesizefromstring($data);
if ($size) {
    echo "Высота: {$size[1]}";
}
Высота: 600

Пример 5: сравнение производительности методов

Пример

$file = 'large.jpg';
$start = microtime(true);
$size = getimagesize($file);
$time1 = microtime(true) - $start;
$start = microtime(true);
$img = imagecreatefromjpeg($file);
$height = imagesy($img);
imagedestroy($img);
$time2 = microtime(true) - $start;
echo "getimagesize: $time1 сек, GD: $time2 сек";
getimagesize: 0.0002 сек, GD: 0.045 сек

Получение высоты в PHP - comments

En
Php height (php)