У меня есть пользовательский конфигуратор велосипедов, который создает прозрачные 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);
Вы должны заменить этот код
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'); ?>