Объединение нескольких перекрывающихся прозрачных png-изображений с помощью php

У меня есть пользовательский конфигуратор велосипедов, который создает прозрачные png-файлы с помощью css. http://www.gallantbicycles.com/build/no1/

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

Здесь я нахожусь прямо сейчас, но это приводит к черному фону, и в результате видно только самое большое изображение:

$width = 720; $height = 500; $layers = array(); $layers[] = imagecreatefrompng("pathtomyimage/image.png"); $layers[] = imagecreatefrompng("pathtomyimage/image.png"); $layers[] = imagecreatefrompng("pathtomyimage/image.png"); $image = imagecreatetruecolor($width, $height); imagealphablending($image, false); imagesavealpha($image, true); for ($i = 0; $i < count($layers); $i++) { imagecopymerge($image, $layers[$i], 0, 0, 0, 0, $width, $height, 100); } header('Content-type: image/png'); imagepng($image); 

Solutions Collecting From Web of "Объединение нескольких перекрывающихся прозрачных png-изображений с помощью php"

Вы должны заменить этот код

 imagealphablending($image, false); imagesavealpha($image, true); for ($i = 0; $i < count($layers); $i++) { imagecopymerge($image, $layers[$i], 0, 0, 0, 0, $width, $height, 100); } 

от

 imagealphablending($image, true); for ($i = 0; $i < count($layers); $i++) { imagecopymerge($image, $layers[$i], 0, 0, 0, 0, $width, $height, 100); } imagealphablending($image, false); imagesavealpha($image, true); 

imagealphablending должно быть true чтобы правильно стекировать слои, но для сохранения изображения оно должно быть false .

Попробуйте это решение: объедините два изображения с прозрачными пленками в PHP

использовать imagecopyresampled вместо imagecopymerge

Вот код, который работает:

 $width = 210; $height = 190; $layers = array(); $layers[] = imagecreatefrompng("img/01_boy_faceB.png"); $layers[] = imagecreatefrompng("img/01_boy_hairB.png"); $image = imagecreatetruecolor($width, $height); // to make background transparent imagealphablending($image, false); $transparency = imagecolorallocatealpha($image, 0, 0, 0, 127); imagefill($image, 0, 0, $transparency); imagesavealpha($image, true); /* if you want to set background color $white = imagecolorallocate($image, 255, 255, 255); imagefill($image, 0, 0, $white); */ imagealphablending($image, true); for ($i = 0; $i < count($layers); $i++) { imagecopy($image, $layers[$i], 0, 0, 0, 0, $width, $height); } imagealphablending($image, false); imagesavealpha($image, true); imagepng($image, 'final_img.png'); ?>