Для 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;
}