изображение — PHP GD сложное сложение нескольких слоев

У меня есть процесс укладки изображений, который я пытаюсь выполнить с помощью PHP GD. У меня есть следующее:

3 изображения:

  1. Маскированный клипарт
  2. Клипарт текстура
  3. Финальный фон

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

Следующий код сортировки работает для этого:

$im = imagecreatetruecolor($width,$height);
imagecopy($im, $texture, 0, 0, 0, 0, $width, $height);
imagecopy($im, $clipart, 0, 0, 0, 0, $width, $height);
imagecolortransparent($im, imagecolorclosest($clipart, 0, 0, 0));

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

Однако когда я открываю этот файл в фотошопе, прозрачные области становятся черными, что также подводит меня к остальной части этой функции:

Теперь, когда у меня есть это изображение, мне нужно наложить его поверх изображения «Финальный фон», чтобы вся прозрачность предыдущего вывода теперь стала текстурой «Финальный фон». Мои мысли были что-то вроде:

$im = imagecreatetruecolor($width,$height);
imagecopy($im, $texture, 0, 0, 0, 0, $width, $height);
imagecopy($im, $clipart, 0, 0, 0, 0, $width, $height);
imagecolortransparent($im, imagecolorclosest($clipart, 0, 0, 0));

$img = imagecreatetruecolor($width,$height);
imagecopy($img, $background, 0, 0, 0, 0, $width, $height);
imagecopy($img, $im, 0, 0, 0, 0, $width, $height);
imagedestroy($im);

return $img;

Проблема заключается в том, что выводится изображение с черным фоном вместо моего окончательного слоя текстуры. Я полагаю, что этот код для окончательного наложения может на самом деле работать нормально, и что черный фон из конечного результата и в фотошопе от отсутствия какой-либо альфа-линии в первой части. Я пытался поиграть с:

imagealphablending( $im, false );
imagesavealpha( $im, true );

Смешивание и сопоставление true / false и чередование только с использованием одного из них, казалось, не имело значения.

Если бы кто-нибудь мог пролить свет на мои ошибки здесь, это было бы очень признательно.


ОБНОВИТЬ

Изображения: http://imgur.com/a/7SN1S

Код:

// Layer clipart over texture and convert black to transparent (works)
$im = imagecreatetruecolor($width,$height);
imagecopy($im, $texture, 0, 0, 0, 0, $width, $height);
imagecopy($im, $clipart, 0, 0, 0, 0, $width, $height);
imagecolortransparent($im, imagecolorclosest($clipart, 0, 0, 0));

// Layer above image with transparency over background (non-working)
$img = imagecreatetruecolor($width,$height);
imagecopy($img, $background, 0, 0, 0, 0, $width, $height);
imagecopy($img, $im, 0, 0, 0, 0, $width, $height);

header('Content-Type: image/png');

//imagepng($im); // Correctly outputs first step
imagejpeg($img); // Incorrectly outputs final result
imagedestroy($im);
imagedestroy($img);

0

Решение

Как отмечено на imagecolortransparent() страница справочника:

Прозрачность копируется только с изображениями imagecopymerge () и изображениями с истинным цветом, а не с изображениями imagecopy () или паллетами.

Итак, изменив следующие две строки (16 & 17 в index.php) …

imagecopy($img, $background, 0, 0, 0, 0, $width, $height);
imagecopy($img, $im, 0, 0, 0, 0, $width, $height);

…к этому…

imagecopymerge($img, $background, 0, 0, 0, 0, $width, $height, 100);
imagecopymerge($img, $im, 0, 0, 0, 0, $width, $height, 100);

…дает (очень близко к) желаемый результат:

Результат

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]