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 точно игнорировать прозрачные цвета и вместо этого сохранять весь альфа-канал.

При объединении обоих изображений ранее прозрачный цвет стал черным.

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

Другие вопросы по тегам