Определение ширины и высоты изображения: PHP методы и примеры

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

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

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

Наиболее эффективное решение - использование встроенной функции getimagesize(). Она возвращает массив с шириной, высотой, типом изображения и строкой для атрибута width/height HTML. Функция поддерживает большинство распространенных форматов (JPEG, PNG, GIF, BMP, WebP и другие).


$info = getimagesize('/path/to/image.jpg');
if ($info) {
    $width = $info[0];
    $height = $info[1];
    echo 'Ширина: ' . $width . ', Высота: ' . $height;
} else {
    echo 'Не удалось получить размеры';
}
  

Php размеры изображения (размеры изображения php)

Результат выполнения:

Ширина: 800, Высота: 600

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

Для изображений более 2 ГБ (редко) функция может работать некорректно. Используйте библиотеки с поддержкой больших файлов (Imagick).

Как определить размеры через библиотеку GD?

Если в проекте уже используется GD для обработки, можно получить размеры через функции imagesx() и imagesy(). Однако требуется сначала создать ресурс изображения, что потребляет больше памяти.


$im = imagecreatefromjpeg('image.jpg'); // или imagecreatefrompng и т.д.
if ($im) {
    $width = imagesx($im);
    $height = imagesy($im);
    imagedestroy($im);
    echo 'Размеры: ' . $width . 'x' . $height;
}
  

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

Как получить размеры с помощью Imagick?

Imagick предоставляет объектно-ориентированный интерфейс. Метод getImageWidth() и getImageHeight() возвращают размеры без полной загрузки в память? На самом деле Imagick загружает метаданные, но не пиксели, поэтому эффективнее GD.


$img = new Imagick('image.jpg');
$width = $img->getImageWidth();
$height = $img->getImageHeight();
echo $width . 'x' . $height;
$img->clear();
  

Ошибки: Расширение Imagick может не быть установлено. Файл поврежден. Решение: обернуть в try-catch и проверять класс Imagick.

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

Если изображение загружено в строку (например, из базы данных или API), используйте getimagesizefromstring(). Работает аналогично getimagesize, но на вход принимает строку.


$data = file_get_contents('image.jpg'); // или откуда-то еще
$info = getimagesizefromstring($data);
if ($info) {
    echo 'Ширина: ' . $info[0] . ', Высота: ' . $info[1];
}
  

Проблема: Вся строка загружается в память, что может быть проблематично для больших файлов. Альтернатива - использовать поток (stream) или временный файл.

Как получить размеры только по заголовкам файла (без чтения всего файла)?

Можно использовать библиотеку exif_read_data() для JPEG, но она выдает размеры только если они записаны в EXIF. Не для всех файлов.


$exif = exif_read_data('image.jpg');
if (isset($exif['COMPUTED']['Width']) && isset($exif['COMPUTED']['Height'])) {
    echo $exif['COMPUTED']['Width'] . 'x' . $exif['COMPUTED']['Height'];
}
  

Ограничения: Только JPEG, не все файлы содержат EXIF. Не подходит для PNG/GIF.

Расширенные примеры определения размеров изображений

Пример 1: Получение размеров удаленного изображения через HTTP с проверкой ошибок

Пример

$url = 'https://example.com/image.jpg';
$context = stream_context_create([
    'http' => ['method' => 'HEAD', 'timeout' => 5]
]);
$fp = fopen($url, 'r', false, $context);
if ($fp) {
    $meta = stream_get_meta_data($fp);
    fclose($fp);
    $temp = tmpfile();
    fwrite($temp, file_get_contents($url, false, $context, 0, 1024));
    rewind($temp);
    $info = getimagesizefromstring(stream_get_contents($temp));
    fclose($temp);
    if ($info) {
        echo 'Удаленное изображение: ' . $info[0] . 'x' . $info[1];
    } else {
        echo 'Не удалось определить размеры';
    }
} else {
    echo 'Не удалось открыть URL';
}
Удаленное изображение: 1920x1080

Пояснение: Используется потоковый контекст с методом HEAD для минимизации трафика. Файл загружается частично, но для getimagesizefromstring достаточно первых нескольких килобайт (обычно 1-2 КБ).

Пример 2: Обработка всех распространенных форматов с универсальной функцией

Пример

function getImageSizeSafe($file) {
    if (!file_exists($file)) {
        return false;
    }
    $info = @getimagesize($file);
    if ($info !== false) {
        return $info;
    }
    if (class_exists('Imagick')) {
        try {
            $img = new Imagick($file);
            return [$img->getImageWidth(), $img->getImageHeight()];
        } catch (Exception $e) {}
    }
    $ext = strtolower(pathinfo($file, PATHINFO_EXTENSION));
    $func = 'imagecreatefrom' . ($ext == 'jpg' ? 'jpeg' : $ext);
    if (function_exists($func)) {
        $im = @$func($file);
        if ($im) {
            $sz = [imagesx($im), imagesy($im)];
            imagedestroy($im);
            return $sz;
        }
    }
    return false;
}
// Пример вызова
list($w, $h) = getImageSizeSafe('photo.webp');
echo $w . 'x' . $h;

Пример 3: Получение размеров всех изображений в папке

Пример

$dir = '/images';
$files = glob($dir . '/*.{jpg,jpeg,png,gif,webp}', GLOB_BRACE);
$results = [];
foreach ($files as $file) {
    $size = @getimagesize($file);
    if ($size) {
        $results[basename($file)] = $size[0] . 'x' . $size[1];
    }
}
print_r($results);
Array
(
    [photo1.jpg] => 800x600
    [photo2.png] => 1024x768
    [photo3.webp] => 1920x1080
)

Пример 4: Использование finfo для определения типа, а затем размеров (комбинированный подход)

Пример

$file = 'image.jpg';
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mime = finfo_file($finfo, $file);
finfo_close($finfo);
if (in_array($mime, ['image/jpeg','image/png','image/gif','image/webp'])) {
    $info = getimagesize($file);
    echo 'Тип: ' . $mime . ', Размер: ' . $info[0] . 'x' . $info[1];
}
Тип: image/jpeg, Размер: 800x600

Примечание: finfo не выдает размеры, но позволяет убедиться, что файл является изображением, прежде чем вызывать getimagesize.

Пример 5: Работа с большими изображениями и ограничением памяти

Пример

$file = 'huge_image.tiff';
if (class_exists('Imagick')) {
    $img = new Imagick();
    $img->pingImage($file);
    echo $img->getImageWidth() . 'x' . $img->getImageHeight();
}
3840x2160

Размеры изображения PHP - comments

En
Php размеры изображения (php)