GD2 - Копирование двух прозрачных изображений приводит к черному фону
Это поражает меня. Я хочу объединить 2 прозрачных PNG.
Одним из них является круг ($source), сгенерированный на лету из квадратного изображения. Вторым является маркер карты ($marker) с прозрачным кружком, чтобы соответствовать первому позади.
imagepng($ источника); и imagepng($ маркер); выходы, как и следовало ожидать. С прозрачным фоном.
Затем я создаю пустое прозрачное изображение размером с маркер, чтобы разместить их вместе:
//NEW BLANK TRANSPARENT IMAGE
$dest = imagecreatetruecolor(50, 61);
$transparent = imagecolorallocatealpha($dest, 0, 0, 0, 127);
imagefill($dest, 0, 0, $transparent);
imagealphablending($dest, true);
imagesavealpha($dest,true);
//COPY THE CIRCLE
imagecopy($dest, $source, 5, 5, 0, 0, 41, 41);
//AND THE MARKER ON TOP
imagecopy($dest, $marker, 0, 0, 0, 0, 50, 61);
В результате круг выглядит как черный квадрат с кругом внутри. Я пробовал много комбинаций imagealphablending и imagesavealpha как на $ source, так и на $dest, и, похоже, ничего не получалось.
Как я могу удалить черный квадрат и оставить $ source прозрачным в результате, как это было до слияния?
1 ответ
Проблема здесь была:
Чтобы создать круг на лету, я создал круглую маску и сделал все остальное прозрачным, сделав его красным, а затем сделав красный прозрачным. Это несовместимо с imagesavealpha (true), так как он говорит движку gd точно игнорировать прозрачные цвета и вместо этого сохранять весь альфа-канал.
При объединении обоих изображений ранее прозрачный цвет стал черным.
Решением для моего случая было проанализировать его пиксель за пикселем и скопировать его в пустое изображение, если оно находится внутри круга, используя круговое уравнение.