Работа с изображениями на PHP: resize, crop (обрезка и масштабирование)

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

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

Начать курс

Работа с изображениями на 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

                
    
    

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