Определение ширины и высоты изображения: 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