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

Конечно, такой способ обрезки не тянет на звание "серебряной пули", но за неимением более продвинутой логики обрезки изображений вполне может успешно использоваться. Код, решающий таким образом задачу, приведен ниже:
/**
* @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">Примеры работы
Исходное изображение:

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

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

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

Comments