Обрезать изображение из центра PHP

Я хочу обрезать изображение из центра размером 200 * 130, изображение, которое нужно обрезать, может отличаться по размеру, если изображение меньше, мы не обрезаем его. Я знаю, как эта часть, где я могу проверить высоту и с помощью изображения, но вид ударил в предмет обрезки с середины изображения Поскольку я не могу понять, как сохранить центр в качестве точки урожая, а не портить его

Ответ 1

GD поставляется вместе со всеми установками PHP с версии 4.3.6, поэтому есть вероятность, что у вас есть.

Вот шаги, которые вам нужно предпринять...

  • Создайте ресурс изображения, используя одну из функций GD imagecreatefrom*(). Тот, который вы используете, зависит от типа изображения, с которым вы имеете дело с
  • Определите размеры изображения с помощью imagesx() и imagesy()
  • Определите координаты катушки, используя следующий алгоритм и обрезку, используя imagecopy()

Найти скользящие координаты

$width  = imagesx($img);
$height = imagesy($img);
$centreX = round($width / 2);
$centreY = round($height / 2);

$cropWidth  = 200;
$cropHeight = 130;
$cropWidthHalf  = round($cropWidth / 2); // could hard-code this but I'm keeping it flexible
$cropHeightHalf = round($cropHeight / 2);

$x1 = max(0, $centreX - $cropWidthHalf);
$y1 = max(0, $centreY - $cropHeightHalf);

$x2 = min($width, $centreX + $cropWidthHalf);
$y2 = min($height, $centreY + $cropHeightHalf);

Не стесняйтесь использовать мой класс манипуляции с изображениями, он должен сделать некоторые аспекты намного проще - https://gist.github.com/880506

$im = new ImageManipulator('/path/to/image');
$centreX = round($im->getWidth() / 2);
$centreY = round($im->getHeight() / 2);

$x1 = $centreX - 100;
$y1 = $centreY - 65;

$x2 = $centreX + 100;
$y2 = $centreY + 65;

$im->crop($x1, $y1, $x2, $y2); // takes care of out of boundary conditions automatically
$im->save('/path/to/cropped/image');

Ответ 2

Боже, почему ты это делаешь? Просто установите значения x и y как количество урожая /2

   $imageSize = getimagesize('thumbnail.png');

$croppedImage = imagecrop(imagecreatefrompng('thumbnail.png'), ['x' => 0, 'y' => ($imageSize[1]-$imageSize[0]*(9/16))/2, 'width' => $imageSize[0], 'height' =>  $imageSize[0]*(9/16)]);

Обратите внимание, как я использовал мой $imageSize [0] * (9/16), который является суммой, которую я обрезаю в направлении y, и я вычитал это из исходной высоты изображения, чтобы найти количество урожая, а затем деленное на 2. Если вы хотите сделать то же самое для ширины, просто выполните те же шаги.

Ответ 3

Это может вам помочь.

function cropCentered($img, $w, $h)
{
  $cx = $img->getWidth() / 2;
  $cy = $img->getHeight() / 2;
  $x = $cx - $w / 2;
  $y = $cy - $h / 2;
  if ($x < 0) $x = 0;
  if ($y < 0) $y = 0;
  return $img->crop($x, $y, $w, $h);
}

Я предполагаю, что вы используете библиотеку GD. $img - это изображение GD, $w и $h - ширина и высота, соответственно, для вашего нового изображения. В вашем случае $w = 200, $h = 130.