Слияние изображений с помощью GD с PHP

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

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

Я использую библиотеку 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.

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

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

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

Фернандо


person Fernando Gabrieli    schedule 04.07.2011    source источник


Ответы (1)


Раньше у меня были проблемы с прозрачностью 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 (выделяю пустое изображение, копирую фоновое изображение в, скопируйте оверлей с прозрачностью в)

person Anthony Sottile    schedule 04.07.2011
comment
Я мог бы объединить оба изображения, следуя вашему коду. Проблема, с которой я столкнулся сейчас, заключается в том, что у одного из этих изображений есть тень. Теперь, когда я использую imagecopy или imagecopyresampled, кажется, что эта тень (серая деградация) сочетается с прозрачным цветом, который я установил для фона, в результате чего окончательное изображение почти идеально, но окружено фоновым прозрачным цветом, который я установил ранее, уродливое зеленый. После того, как я получил это, я попытался вместо этого использовать прозрачный PNG, но эти пиксели снова стали проблемой: я получаю какое-то размытие. Звучит как проблема с изображением, не связанная с программированием. - person Fernando Gabrieli; 06.07.2011