У меня есть следующий скрипт, который успешно обрезает и изображение в центральной точке с помощью 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;
на моем сайте пользователи могут выбрать «основной фокус» изображения, в котором я обрежу изображение вокруг этого. Фокус будет предоставлен в процентах. У меня уже есть процент и способ выбора для клиента, мне просто нужно взять эти значения и обойти их. Можно ли это сделать? Например, если я хочу, чтобы мое изображение обрезалось вокруг точки, как показано на рисунке ниже:
Следующая функция должна делать то, что вы хотите.
(Обратите внимание, что это предполагает 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);
Других решений пока нет …