Ни одно из решений не работало для меня, оно всегда конвертировало бы прозрачные пиксели исходного изображения в черный на конечном изображении. То, что работало, меняло imagecopy / imagecopymerge / imagecopymerge_alpha на imagecopy с повторной выборкой и просто передавая одинаковую ширину и высоту дважды.
//Create destination image.
$png = imagecreatetruecolor(1024, 1024);
imagealphablending($png, false);
imagesavealpha($png, true);
//Make destination image be all transparent.
$color = imagecolorallocatealpha($png, 0, 0, 0, 127); //127 means completely transparent.
imagefill($png, 0, 0, $color);
//Load source image.
$png2 = imagecreatefrompng($sourceurl);
imagealphablending($png2, false);
imagesavealpha($png2, true);
$sizex = imagesx($png2);
$sizey = imagesy($png2);
//Copy to destination and save to file.
imagecopyresampled( $png, $png2,
0, 0,
0, 0,
$sizex, $sizey,
$sizex, $sizey);
imagepng($png, "result.png");