Работа с изображениями на PHP: изменение размеров и обрезка (resize, crop)
Обработка изображений — одна из самых частых задач при разработке веб-приложений. Загрузка аватаров, создание миниатюр, адаптация картинок под разные разрешения экранов — всё это требует изменения размеров (resize) и обрезки (crop). В PHP для этих целей существует два основных инструмента: встроенное расширение GD и более мощная библиотека Imagick. В этой статье мы разберём оба подхода с практическими примерами.
1. Расширение GD (стандартный инструмент)
GD — это самое популярное и доступное расширение для работы с изображениями. Оно встроено в большинство сборок PHP и не требует дополнительной установки. GD поддерживает основные форматы: JPEG, PNG, GIF, WebP.
1.1. Изменение размера (resize) с сохранением пропорций
Классическая задача — уменьшить большое изображение до заданной ширины, сохраняя соотношение сторон. Ниже приведён пример функции, которая масштабирует картинку до указанной ширины.
<?php
function resizeImage($srcFile, $destFile, $newWidth) {
// Получаем информацию об исходном изображении
list($width, $height, $type) = getimagesize($srcFile);
// Вычисляем новую высоту пропорционально
$ratio = $width / $height;
$newHeight = $newWidth / $ratio;
// Создаём холст для нового изображения
$srcImage = imagecreatefromjpeg($srcFile); // для JPEG
$destImage = imagecreatetruecolor($newWidth, $newHeight);
// Копируем и масштабируем
imagecopyresampled($destImage, $srcImage, 0, 0, 0, 0, $newWidth, $newHeight, $width, $height);
// Сохраняем результат
imagejpeg($destImage, $destFile, 90); // качество 90%
// Очищаем память
imagedestroy($srcImage);
imagedestroy($destImage);
}
// Пример использования
resizeImage('photo.jpg', 'photo_thumb.jpg', 300);
?>
Для работы с PNG или GIF необходимо использовать функции imagecreatefrompng() и imagecreatefromgif(), а также сохранять через imagepng() или imagegif().
1.2. Обрезка изображения (crop) по центру
Часто требуется не просто уменьшить, а вырезать квадратную область из центра изображения. Это называется центрированным crop.
<?php
function cropCenter($srcFile, $destFile, $cropSize) {
list($width, $height, $type) = getimagesize($srcFile);
// Определяем координаты для вырезания квадрата по центру
$srcX = ($width - $cropSize) / 2;
$srcY = ($height - $cropSize) / 2;
// Если изображение меньше требуемого размера, просто масштабируем
if ($width < $cropSize || $height < $cropSize) {
$ratio = min($cropSize / $width, $cropSize / $height);
$newWidth = $width * $ratio;
$newHeight = $height * $ratio;
$srcImage = imagecreatefromjpeg($srcFile);
$destImage = imagecreatetruecolor($cropSize, $cropSize);
// Заливаем белым фоном
$white = imagecolorallocate($destImage, 255, 255, 255);
imagefill($destImage, 0, 0, $white);
// Копируем с центрированием
imagecopyresampled($destImage, $srcImage, ($cropSize - $newWidth) / 2, ($cropSize - $newHeight) / 2, 0, 0, $newWidth, $newHeight, $width, $height);
} else {
$srcImage = imagecreatefromjpeg($srcFile);
$destImage = imagecreatetruecolor($cropSize, $cropSize);
imagecopyresampled($destImage, $srcImage, 0, 0, $srcX, $srcY, $cropSize, $cropSize, $cropSize, $cropSize);
}
imagejpeg($destImage, $destFile, 90);
imagedestroy($srcImage);
imagedestroy($destImage);
}
// Пример: квадрат 200x200 из центра
cropCenter('photo.jpg', 'photo_cropped.jpg', 200);
?>
2. Библиотека Imagick (продвинутый инструмент)
Imagick — это PHP-обёртка над мощной утилитой ImageMagick. Она предоставляет гораздо больше возможностей: работа с PDF, векторной графикой, сложные эффекты, поддержка огромного количества форматов. Для установки требуется sudo apt install php-imagick (на Ubuntu) или раскомментировать строку в php.ini.
Синтаксис Imagick более лаконичен и объектно-ориентирован.
2.1. Изменение размера (resize) с помощью Imagick
Также в библиотеке
Рекомендаций