PHP GD — обрезать изображение вокруг любой заданной точки

У меня есть следующий скрипт, который успешно обрезает и изображение в центральной точке с помощью php gd:

list($source_width, $source_height, $source_type) = getimagesize($img_path);

define('IMAGE_WIDTH', 200);
define('IMAGE_HEIGHT', 300);

$ratio = $source_width / $source_height;
$desired_aspect_ratio = IMAGE_WIDTH / IMAGE_HEIGHT;

if ($ratio > $desired_aspect_ratio) {
$temp_height = IMAGE_HEIGHT;
$temp_width = ( int ) (IMAGE_HEIGHT * $ratio);
} else {
$temp_width = IMAGE_WIDTH;
$temp_height = ( int ) (IMAGE_WIDTH / $ratio);
}

$x = ($temp_width - IMAGE_WIDTH) / 2;
$y = ($temp_height - IMAGE_HEIGHT) / 2;

$cropped = imagecreatetruecolor(IMAGE_WIDTH, IMAGE_HEIGHT);
imagecopy(
$cropped,
$temp,
0, 0,
$x, $y,
IMAGE_WIDTH, IMAGE_HEIGHT
);

Вместо этого для центра:

$x = ($temp_width - IMAGE_WIDTH) / 2;
$y = ($temp_height - IMAGE_HEIGHT) / 2;

на моем сайте пользователи могут выбрать «основной фокус» изображения, в котором я обрежу изображение вокруг этого. Фокус будет предоставлен в процентах. У меня уже есть процент и способ выбора для клиента, мне просто нужно взять эти значения и обойти их. Можно ли это сделать? Например, если я хочу, чтобы мое изображение обрезалось вокруг точки, как показано на рисунке ниже:

введите описание изображения здесь

2

Решение

Следующая функция должна делать то, что вы хотите.

  • передача только первого аргумента выведет то, что у вас есть сейчас: середина исходного изображения обрезана до 200px / 200px.
  • второй и третий аргументы позволяют указывать процентные координаты X / Y для центра обрезки, как вы хотите.
  • четвертый и пятый аргументы позволяют вам установить размер обрезанного изображения.

(Обратите внимание, что это предполагает PNG, но вы сможете легко адаптировать его для других форматов, если это необходимо.)

function crop($file, $cropX = 50, $cropY = 50, $cropW = 200, $cropH = 200)
{
$src = imagecreatefrompng($file);
$dest = imagecreatetruecolor($cropW, $cropH);

list($src_w, $src_h) = getimagesize($file);

// calculate x/y coordinates for crop from supplied percentages.
$src_x = (($src_w / 100) * $cropX) - ($cropW / 2);
$src_y = (($src_h / 100) * $cropY) - ($cropH / 2);

imagecopy($dest, $src, 0, 0, $src_x, $src_y, $src_w, $src_h);

imagedestroy($src);

return $dest;
}

Пример использования (установка фокуса обрезки X на 70%):

$img = crop('test.png', 70);
header('Content-type: image/png');
imagepng($img);
imagedestroy($img);
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]