Getimagesize: примеры (PHP)
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
Функции возвращают ширину и высоту уже созданного в памяти ресурса изображения (например, полученного через imagecreatefromjpeg()). getimagesize() работает с файлами на диске, не загружая изображение в память полностью.
<?php
$img = imagecreatefrompng('image.png');
$width = imagesx($img);
$height = imagesy($img);
?>Функция определяет тип изображения быстрее, чем getimagesize(), так как читает только первые байты файла. Возвращает константу IMAGETYPE_XXX или false. Полезна для валидации типа без чтения всей информации о размере.
Функция из расширения Fileinfo может определить MIME-тип любого файла, а не только изображения. Используется, когда нужно универсальное решение.
Аналоги в других языках
Модуль 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
Для получения размеров изображения, уже загруженного в 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>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
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
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; // Валидация пройдена
}
?><?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>';
}
?>Функция getimagesize() может обрабатывать SVG файлы, если PHP собран с поддержкой XML и библиотека определяет этот тип. Однако размеры SVG могут быть указаны в относительных единицах или отсутствовать, что приводит к неоднозначным результатам.
<?php
$info = @getimagesize('image.svg');
if ($info && $info['mime'] == 'image/svg+xml') {
echo 'Это SVG.';
} else {
echo 'SVG не поддерживается или файл поврежден.';
}
?><?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);
?>