Слияние изображений с использованием GD с PHP - PullRequest
0 голосов
/ 04 июля 2011

Я работаю над созданием одного PNG-изображения из двух других.

Изображения A и B имеют одинаковые размеры, оба имеют размер 200x400 пикселей.Окончательное изображение то же самое.

Я использую библиотеку GD с PHP.

Итак, моя идея состояла в том, чтобы создать PNG-24 из моего исходного PNG-8, затем использовать прозрачность цвета и, наконец, скопировать второе изображение в этот новый PNG-24.В любом случае, проблема появляется на первом этапе, когда вы переходите от PNG-24 к PNG-8 с прозрачностью цвета:

Это для получения оригинального PNG-8 и его размеров:

$png8 = imagecreatefrompng($imageUrl);
$size = getimagesize($imageUrl);

Теперь я создаю новый PNG и заливаю фон зеленым цветом (не представлен на изображениях):

$png24 = imagecreatetruecolor($size[0], $size[1]);
$transparentIndex = imagecolorallocate($png24, 0x66, 0xff, 0x66);
imagefill($png24, 0, 0, $transparentIndex);

Это для того, чтобы сделать зеленый цвет прозрачным:

imagecolortransparent($png24, $transparentIndex);     

Затем я копирую png8 в PNG-24:

imagecopy($png24, $png8, 0, 0, 0, 0, $size[0], $size[1]);

Так вот в чем проблема: оригинальный PNG-8 выглядит хорошо, но у него есть зеленая рамка, окружающая фигуру в исходном изображении.Это трудно объяснить на самом деле.Похоже, некоторая часть зеленого фона осталась в оставшемся PNG.

Что я могу сделать?

заранее спасибо

С наилучшими пожеланиями,

Fernando

1 Ответ

1 голос
/ 04 июля 2011

Раньше у меня были некоторые проблемы с прозрачностью png, и я смог решить их следующим образом:

// allocate original image to copy stuff to
$img = imagecreatetruecolor(200, 100);

// create second image
$bg = imagecreatefrompng('bg.png');

// copy image onto it using imagecopyresampled
imagecopyresampled($img, $bg, 0, 0, 0, 0, 200, 100, 200, 100);
imagedestroy($bg);

// create third image
// do same routine
$fg = imagecreatefrompng('fg.png');
imagecopyresampled($img, $fg, 50, 50, 0, 0, 50, 50, 50, 50);
imagedestroy($fg);

// output image
imagepng($img);
imagedestroy($img);

Я думаю, что единственное различие между моим и вашим - imagecopy() против imagecopyresampled().Кажется, я помню, что у меня были проблемы с этим, хотя это было довольно давно.Вы можете увидеть пример изображения, на котором я использую этот шаблон, здесь: http://www.ipnow.org/images/1/bggrad/bg4/yes/TRANSIST.TTF/8B0000/custombrowserimage.jpg (я выделяю пустое изображение, копирую фоновое изображение, копирую оверлей с прозрачностью)

...