Работа с изображениями в PHP: resize, crop и оптимизация с GD и Imagick

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Работа с изображениями в 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) даёт наилучшее качество:

Рекомендаций