GD или imagemagick. Как вырезать многоугольник из изображения?

Можно ли при помощи GD или ImageMagic вырезать из изображения многоугольник для его дальнейшей вставки в другое изображение?


imagecopy()/imagecopyresized()/imagecopyresampled() — позволяют вырезать прямоугольник. А нужен именно многоугольник, если точнее то пятиугольник (сота).
  • Вопрос задан
  • 5841 просмотр
Пригласить эксперта
Ответы на вопрос 4
Stdit
@Stdit
Эмм… сота это шестиугольник. :)
Можно попробовать сделать как-то так:
1. Копируем прямоугольник, описывающий нужный нам многоугольник, и вставляем во временное изображение.
2. Вычисляем области, которые нужно срезать, формируем из них треугольники.
3. Заливаем эти треугольники прозрачным цветом.
4. Получившийся шестиугольник копируем (в виде прямоугольника) и вставляем в другую картинку.
Ответ написан
@doranych
Боюсь, что нет.
Но задачу можно выполнить другим образом.
Можно для начала уменьшить картинку так, чтобы необходимая область была подходящего размера. Затем путём нес ложным манипуляций накладывает шаблонное пнг изображение с прозрачной пятиугольной частью в центре и залитую, допустим, белым.
И завершающий этап — обрезать изображение так, чтобы максимально убрать белую — пустую составляющую, т.е. описанным вокруг соты прямоугольником и собственно профит.
Ответ написан
PaulZi
@PaulZi
Для GD можно использовать заранее подготовленную маску в png файле. Вот код из класса для наложения одного изображения на другого. От параметра blend зависит как будет накладываться — копироваться альфа-канал, или накладываться используя его.
/*
	mask($mask)
	Описание:	Накладывает на исходное изображение, второе в центр.
	Аргументы:
		mask	- второе изображение
		align	- выравнивание маски
		blend	- режим наложения прозрачности маски
	Возвращает:	итоговое изображение
*/
public function mask($mask, $align=0, $blend=true)
{
	$out = imagecreatetruecolor($this->w, $this->h);
	imagealphablending($out, false);
	imagecopy($out, $this->img, 0, 0, 0, 0, $this->w, $this->h);
	imagealphablending($out, $blend);
		
	// выравнивание
	$posx = ($align & self::AGN_L) ? 0 : (($align & self::AGN_R) ? $this->w - $mask->w : ($this->w - $mask->w)>>1);
	$posy = ($align & self::AGN_T) ? 0 : (($align & self::AGN_B) ? $this->h - $mask->h : ($this->h - $mask->h)>>1);
	
	imagecopy($out, $mask->img, $posx, $posy, 0, 0, $mask->w, $mask->h);
	return $out;
}
Ответ написан
Комментировать
demimurych
@demimurych
www.imagemagick.org/Usage/thumbnails/
Mask 'n' Paint Technique
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы