Объединение нескольких прозрачных PNG в один - PullRequest
1 голос
/ 01 сентября 2011

Я создаю рекламу с изогнутой рамкой.

Вот пример объявления: http://imageshack.us/f/20/4e5f5fe94b327new60seciq.png/

Я пытаюсь повторить то, что будет сделано в Photoshop, поместите одно поверхдругой.Вот код, который я использую:

// create destination canvas
$dest_img = imagecreatetruecolor(176, 75);

// Make the background transparent
$black = imagecolorallocate($dest_img, 0, 0, 0);
imagecolortransparent($dest_img, $black);

imageAlphaBlending($dest_img, false);
imageSaveAlpha($dest_img, true);

// copy ad into destination
imagecopy($dest_img, $ad_image, 0, 0, 0, 0, 176, 75);

// copy frame onto first half of image
imagecopy($dest_img, $curve_image, 0, 0, 0, 0, 88, 75);

Что происходит, так это то, что последняя имеющаяся копия (фрейм) имеет приоритет и вместо того, чтобы видеть рекламу, я получаю прозрачный блок.Вот взорванное изображение того, что делает GD:

http://imageshack.us/f/684/unled1to.png/

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

if (bottom_px == trans && top_px == trans) {
    dest_px = trans;
}
else {
    dest_px = top_px;
}

1 Ответ

0 голосов
/ 01 сентября 2011

Установите imagealphablending в true.Из руководства добавлен акцент:

В режиме наложения компонент альфа-канала цвета, предоставляемого всем функциям рисования, например, imagesetpixel (), определяет, какой части основного цвета должно быть разрешено сиять.через.В результате gd автоматически смешивает существующий цвет в этой точке с цветом рисунка и сохраняет результат в изображении.Полученный пиксель непрозрачен. В режиме без наложения цвет рисунка копируется буквально с информацией об альфа-канале, заменяя целевой пиксель. Режим наложения недоступен при рисовании на изображениях палитры.

Такжевы на самом деле не окрашиваете фон прозрачным.Вы просто говорите, что $black прозрачен.Вместо этого используйте imagefill с imagecolorallocatealpha:

imagefill($dest_img, 0, 0, imagecolorallocatealpha($dest_img, 0, 0, 0, 127));
...