Работа с изображениями в PHP: resize, crop и оптимизация
Обработка изображений — одна из ключевых задач при разработке веб-приложений. Будь то аватарки пользователей, превью для новостей или галереи товаров — вам почти всегда нужно изменять размер (resize) и обрезать (crop) картинки. В PHP для этого есть две основные библиотеки: GD (встроенная) и Imagick (расширение на базе ImageMagick).
В этой статье мы разберём оба подхода, покажем рабочие примеры кода и дадим рекомендации, какую библиотеку выбрать для вашего проекта.
1. Библиотека GD (GDLib)
GD — это стандартное расширение PHP, доступное практически на любом хостинге. Оно поддерживает основные форматы: JPEG, PNG, GIF, WEBP (с PHP 7.1+). Минус — более низкое качество ресемплинга по сравнению с Imagick, но для большинства задач его возможностей достаточно.
1.1. Изменение размера (resize) с GD
Функция imagecopyresampled() создаёт новое изображение с интерполяцией (сглаживанием). Пример масштабирования до ширины 300px с сохранением пропорций:
<?php
function resizeImageGD($srcFile, $destFile, $newWidth = 300) {
// Получаем размеры исходного изображения
list($width, $height, $type) = getimagesize($srcFile);
// Создаём ресурс исходного изображения в зависимости от типа
switch ($type) {
case IMAGETYPE_JPEG:
$src = imagecreatefromjpeg($srcFile);
break;
case IMAGETYPE_PNG:
$src = imagecreatefrompng($srcFile);
break;
case IMAGETYPE_GIF:
$src = imagecreatefromgif($srcFile);
break;
default:
return false;
}
// Вычисляем новую высоту пропорционально
$ratio = $width / $height;
$newHeight = intval($newWidth / $ratio);
// Создаём пустое изображение нужного размера
$dst = imagecreatetruecolor($newWidth, $newHeight);
// Включаем альфа-канал для PNG/GIF
imagealphablending($dst, false);
imagesavealpha($dst, true);
// Ресамплинг (копирование с пересчётом пикселей)
imagecopyresampled($dst, $src, 0, 0, 0, 0, $newWidth, $newHeight, $width, $height);
// Сохраняем результат
imagejpeg($dst, $destFile, 85); // качество 85%
// Освобождаем память
imagedestroy($src);
imagedestroy($dst);
return true;
}
// Использование:
resizeImageGD('photo.jpg', 'photo_thumb.jpg', 300);
?>
1.2. Обрезка (crop) с GD
Для обрезки используем функцию imagecopy() или imagecopyresampled() с указанием области. Пример — вырезаем центральный квадрат 200x200:
<?php
function cropCenterGD($srcFile, $destFile, $cropSize = 200) {
list($width, $height, $type) = getimagesize($srcFile);
// Определяем тип
$src = imagecreatefromjpeg($srcFile); // для примера JPEG
// Вычисляем координаты центрального квадрата
$x = ($width - $cropSize) / 2;
$y = ($height - $cropSize) / 2;
// Если исходное изображение меньше размера обрезки — не обрезаем
if ($width < $cropSize || $height < $cropSize) {
$cropSize = min($width, $height);
$x = 0;
$y = 0;
}
$dst = imagecreatetruecolor($cropSize, $cropSize);
imagecopy($dst, $src, 0, 0, $x, $y, $cropSize, $cropSize);
imagejpeg($dst, $destFile, 90);
imagedestroy($src);
imagedestroy($dst);
}
cropCenterGD('photo.jpg', 'cropped.jpg', 200);
?>
2. Библиотека Imagick
Imagick — мощное расширение, предоставляющее объектно-ориентированный интерфейс к ImageMagick. Поддерживает более 200 форматов, отличное качество ресемплинга, работу с цветами, фильтрами и анимацией. Требует установки на сервере (не всегда доступно на дешёвом хостинге).
2.1. Изменение размера (resize) с Imagick
Метод resizeImage() с константами фильтра (например, Imagick::FILTER_LANCZOS) даёт наилучшее качество:
Также в библиотеке
Мониторинг Swift-приложений: библиотеки и инструменты для iOS/macOS
Обработка Markdown на Rust: библиотеки, парсеры и инструменты
PDF генерация в Java: обзор библиотек iText, Apache PDFBox, OpenPDF
Sarama для Go: полное руководство с примерами
Swagger/OpenAPI для C# (.NET): Генерация и документация API