Блог о программировании

Обрезка изображений в PHP стандартными средствами

Категория: PHP
 8 июля 2016 г. 11:41

В веб-разработке часто встает задача нарезки изображений, например, для создания аватарки, для отображения изображений в новостях сайтов, в конце-концов, для предпросмотра изображений. Для этих целей может сгодиться универсальный способ обрезки: выделить наиболее подходящую центральную область на первоначальном изображении и перенести эту область, предварительно смасштабировав, на новое изображение необходимого размера. На картинке будет много яснее:

Обрезанное по центру изображение

Конечно, такой способ обрезки не тянет на звание "серебряной пули", но за неимением более продвинутой логики обрезки изображений вполне может успешно использоваться. Код, решающий таким образом задачу, приведен ниже:

/**
 * @param string $aInitialImageFilePath - строка, представляющая путь к обрезаемому изображению
 * @param string $aNewImageFilePath - строка, представляющая путь куда нахо сохранить выходное обрезанное изображение
 * @param int $aNewImageWidth - ширина выходного обрезанного изображения
 * @param int $aNewImageHeight - высота выходного обрезанного изображения
 */
function cropImage($aInitialImageFilePath, $aNewImageFilePath, $aNewImageWidth, $aNewImageHeight) {
    if (($aNewImageWidth < 0) || ($aNewImageHeight < 0)) {
        return false;
    }

    // Массив с поддерживаемыми типами изображений
    $lAllowedExtensions = array(1 => "gif", 2 => "jpeg", 3 => "png"); 
    
    // Получаем размеры и тип изображения в виде числа
    list($lInitialImageWidth, $lInitialImageHeight, $lImageExtensionId) = getimagesize($aInitialImageFilePath); 
    
    if (!array_key_exists($lImageExtensionId, $lAllowedExtensions)) {
        return false;
    }
    $lImageExtension = $lAllowedExtensions[$lImageExtensionId];
    
    // Получаем название функции, соответствующую типу, для создания изображения
    $func = 'imagecreatefrom' . $lImageExtension; 
    // Создаём дескриптор исходного изображения
    $lInitialImageDescriptor = $func($aInitialImageFilePath);

    // Определяем отображаемую область
    $lCroppedImageWidth = 0;
    $lCroppedImageHeight = 0;
    $lInitialImageCroppingX = 0;
    $lInitialImageCroppingY = 0;
    if ($aNewImageWidth / $aNewImageHeight > $lInitialImageWidth / $lInitialImageHeight) {
        $lCroppedImageWidth = floor($lInitialImageWidth);
        $lCroppedImageHeight = floor($lInitialImageWidth * $aNewImageHeight / $aNewImageWidth);
        $lInitialImageCroppingY = floor(($lInitialImageHeight - $lCroppedImageHeight) / 2);
    } else {
        $lCroppedImageWidth = floor($lInitialImageHeight * $aNewImageWidth / $aNewImageHeight);
        $lCroppedImageHeight = floor($lInitialImageHeight);
        $lInitialImageCroppingX = floor(($lInitialImageWidth - $lCroppedImageWidth) / 2);
    }
    
    // Создаём дескриптор для выходного изображения
    $lNewImageDescriptor = imagecreatetruecolor($aNewImageWidth, $aNewImageHeight);
    imagecopyresampled($lNewImageDescriptor, $lInitialImageDescriptor, 0, 0, $lInitialImageCroppingX, $lInitialImageCroppingY, $aNewImageWidth, $aNewImageHeight, $lCroppedImageWidth, $lCroppedImageHeight);
    $func = 'image' . $lImageExtension;
    
    // сохраняем полученное изображение в указанный файл
    return $func($lNewImageDescriptor, $aNewImageFilePath);
}

Пользоваться функцией достаточно просто. Сначала формируем обрезанное изображение:

cropImage($_SERVER['DOCUMENT_ROOT'] . "/1.jpg", $_SERVER['DOCUMENT_ROOT'] . "/1_cropped.jpg", 480, 320);

После чего отображаем его на странице:

<img src="/1_cropped.jpg">

Примеры работы

Исходное изображение:

Изображение пример

Некоторые результаты обрезки:

Изображение пример

Исходное изображение:

Изображение пример

Некоторые результаты обрезки:

Изображение пример
Теги:  php  php7 

Поделиться статьей

Оставить комментарий