Загрузка изображения с закругленными углами

Я пытаюсь загрузить свои файлы в виде кругов, но не могу заставить их работать.
Я видел несколько тем о применении маски к изображению, но когда я применяю маску, это занимает много времени, и сервер закрывает запрос.

Я использую Intervention Image библиотека для Laravel

Мой код выглядит следующим образом:

$identifier = "{$this->loggedUser->id}" . str_random(9) . ".{$file->getClientOriginalExtension()}";
$mask = $this->createCircleMask(200, 200);
$thumbMask = $this->createCircleMask(40, 40);
Image::make($file->getRealPath())->mask($mask)->save(public_path("images/profile/{$identifier}"));
Image::make($file->getRealPath())->mask($thumbMask)->save(public_path("images/profile/thumbs/{$identifier}"));

createCircleMask Метод выглядит так:

public function createCircleMask($width, $height)
{
$circle = Image::canvas($width, $height, '#000000');
return $circle->circle($width - 1, $width / 2, $height / 2);
}

2

Решение

Вот функция, которая работает в моем случае. Но ТОЛЬКО если я использую драйвер imagick. Стандартная библиотека gd работает очень медленно, по крайней мере, на моем тестовом компьютере.
Вы можете взглянуть на vendor \ вмешательство \ image \ src \ Intervention \ Image \ Gd \ Commands \ MaskCommand.php, чтобы узнать почему.

public function upload() {

$path = storage_path('app')."/";

$image = \Image::make(\Input::file('image'));
$image->encode('png');

/* if you want to have a perfect and complete circle using the whole width and height the image
must be shaped as as square. If your images are not guaranteed to be a square maybe you could
use Intervention's fit() function */
//  $image->fit(300,300);

// create empty canvas
$width = $image->getWidth();
$height = $image->getHeight();
$mask = \Image::canvas($width, $height);

// draw a white circle
$mask->circle($width, $width/2, $height/2, function ($draw) {
$draw->background('#fff');
});

$image->mask($mask, false);
$image->save($path."circled.png");

}
6

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

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

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