У меня есть процесс укладки изображений, который я пытаюсь выполнить с помощью PHP GD. У меня есть следующее:
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);
Как отмечено на 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);
…дает (очень близко к) желаемый результат:
Других решений пока нет …