Обрезка изображения с настраиваемым выравниванием
Вот собственная реализация функции (называемой cropAlign
), которая может обрезать изображение до заданной ширины и высоты с выравниванием до 9.стандартные точки (4 ребра, 4 угла, 1 центр).
Просто передайте изображение, нужный размер кадрирования и выравнивание подве оси (вы можете использовать left
, center
, right
или top
, middle
, bottom
независимо от оси) для функции cropAlign
.
Спецификация
Описание
cropAlign(resource $image, int $width, int $height, string $horizontalAlign = 'center', string $verticalAlign = 'middle')
Параметры
image
: ресурс изображения,возвращается одной из функций создания изображения, например imagecreatetruecolor()
. width
: ширина окончательного обрезанного изображения. height
: высота окончательного обрезанного изображения. horizontalAlign
: где культура должна быть выровнена вдоль горизонтальной оси.Возможные значения: left
/ top
, center
/ middle
, right
/ bottom
. verticalAlign
: где выровнять урожайвдоль вертикальной оси.Возможные значения: left
/ top
, center
/ middle
, right
/ bottom
.
Возвращаемые значения
Возврат ресурса обрезанного изображения вуспех или FALSE
при неудаче.Это происходит от imagecrop()
.
Исходный код
function cropAlign($image, $cropWidth, $cropHeight, $horizontalAlign = 'center', $verticalAlign = 'middle') {
$width = imagesx($image);
$height = imagesy($image);
$horizontalAlignPixels = calculatePixelsForAlign($width, $cropWidth, $horizontalAlign);
$verticalAlignPixels = calculatePixelsForAlign($height, $cropHeight, $verticalAlign);
return imageCrop($image, [
'x' => $horizontalAlignPixels[0],
'y' => $verticalAlignPixels[0],
'width' => $horizontalAlignPixels[1],
'height' => $verticalAlignPixels[1]
]);
}
function calculatePixelsForAlign($imageSize, $cropSize, $align) {
switch ($align) {
case 'left':
case 'top':
return [0, min($cropSize, $imageSize)];
case 'right':
case 'bottom':
return [max(0, $imageSize - $cropSize), min($cropSize, $imageSize)];
case 'center':
case 'middle':
return [
max(0, floor(($imageSize / 2) - ($cropSize / 2))),
min($cropSize, $imageSize),
];
default: return [0, $imageSize];
}
}
Пример использования
Вот несколько примеров обрезки с использованием это изображение чайника Юта .
$im = imagecreatefrompng('https://i.stack.imgur.com/NJcML.png');
imagePng(cropAlign($im, 200, 250, 'center', 'middle'));
imagePng(cropAlign($im, 300, 150, 'left', 'top'));
imagePng(cropAlign($im, 1000, 250, 'right', 'middle'));
Вход
Выход
cropAlign($im, 200, 250, 'center', 'middle')
cropAlign($im, 300, 150, 'left', 'top')
cropAlign($im, 1000, 250, 'right', 'middle')