PHP+GD: imagecopymerge не сохраняет прозрачность PNG

У меня есть два файла PNG, "red.png" и "blue.png"; они оба в основном прозрачные, но в разных местах есть несколько пикселей красных или синих пятен.

Я хочу сделать сценарий PHP, который объединяет два; это должно быть так просто, как что-то вроде:

$original = getPNG('red.png');
$overlay = getPNG('blue.png');

imagecopymerge($original, $overlay, 0,0, 0,0, imagesx($original), imagesy($original),   100);
header('Content-Type: image/png');
imagepng($original);

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

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

(как на оригинале, так и на оверлее?) И это, похоже, не поможет.

Я видел несколько обходных путей на PHP.net, что-то вроде:

$throwAway = imagecreatefrompng($filename);
imagealphablending($throwAway, false);
imagesavealpha($throwAway, true);
$dstImage = imagecreatetruecolor(imagesx($throwAway), imagesy($throwAway));
imagecopyresampled($dstImage, $throwAway,0,0,0,0, imagesx($throwAway),     imagesy($throwAway),          imagesx($throwAway), imagesy($throwAway));

, который должен преобразовать PNG в изображение "truecolor" и сохранить прозрачность. Кажется, это так, но теперь я вижу только синий цвет на черном фоне.

Что я делаю?!

1 ответ

Решение

Это прекрасно работает для меня:

$img1 = imagecreatefrompng('red.png');
$img2 = imagecreatefrompng('blue.png');

$x1 = imagesx($img1);
$y1 = imagesy($img1);
$x2 = imagesx($img2);
$y2 = imagesy($img2);

imagecopyresampled(
    $img1, $img2,
    0, 0, 0, 0,
    $x1, $y1,
    $x2, $y2);

imagepng($img1, 'merged.png', 0);

Версия PHP 5.3.2
GD версия 2.0
libPNG версия 1.2.42

Вы пытались сохранить изображение в файл и проверить это?

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