Этот код должен сохранять альфа, но он медленнее, чем imagefilter:
$im = ImageCreateFromString(file_get_contents($source_file));
$width=imagesx();
$height=imagesy();
for($x=0;$x<$width;$x++)
for($y=0;$y<$height;$y++)
{
$rgb=imagecolorsforindex($im,imagecolorat($im,$x,$y));
$average=ceil(($rgb["red"]+$rgb["green"]+$rgb["blue"])/3);
imagesetpixel($im,$x,$y,imagecolorallocatealpha($im,$average,$average,$average,$rgb['alpha']));
}
Если у вас все еще есть проблемы, попробуйте написать это после создания образа (до $ width = ..):
imagesavealpha($im,true);