Прозрачность изображения в библиотеке PHP GD - PullRequest
2 голосов
/ 14 сентября 2011

Мне нужно создать изображение PNG из 4 частей другого изображения PNG с разными уровнями прозрачности, используя библиотеку GD в PHP. Например:

Результат должен выглядеть следующим образом

Я пытался сделать это по-разному, но не смог достичь желаемого результата.

Заранее спасибо;)

Ответы [ 3 ]

2 голосов
/ 23 сентября 2011

Загрузите ваше изображение с помощью imagecreatefrompng ().Создайте настоящее цветное изображение с помощью imagecreatetruecolor (), а затем установите его полностью прозрачным с помощью imagecolorallocatealpha () и imagefill ().Затем установите режим альфа-смешивания для исходного и конечного изображений с помощью imagealphablending ().После этого вы можете использовать imagecopymerge () для копирования изображения с альфа-версией.

К сожалению, невозможно применить альфа-множитель для imagecopymerge (), так что это приведет вас только наполовину - неудобные опции включают в себя повторение imagecopymerge() вызывает те части изображения, которые вы хотите сделать менее прозрачными, выбирая между несколькими исходными изображениями в зависимости от уровня прозрачности, который вы хотите использовать, или проходя изображение попиксельно, что неудобно медленно.

Если вы не состоите в браке с функциями изображения *, рассмотрите вариант использования ImageMagick .Это гораздо надежнее.

0 голосов
/ 30 января 2013

Это сработало для меня как с gif, так и с png (конечно, при использовании этого типа изображения измените каждую ссылку на png в этом примере на gif).

$virtual_image = imagecreatetruecolor($desired_width, $desired_height);
$colour = imagecolorallocate($virtual_image,255,255,255);
imagefill($virtual_image , 0, 0, $colour);
imagealphablending($virtual_image,true);
imagesavealpha($virtual_image , true);

//the next line only if you're resizing to a new $width/$height, otherwise leave this line out
imagecopyresampled($virtual_image, $source_image, 0, 0, 0, 0, $desired_width, $desired_height, $width, $height);

header('Content-Type: image/png');

if (imagepng($virtual_image)) imagedestroy($virtual_image);
0 голосов
/ 13 октября 2011

Я сделал это:

$output = imagecreatetruecolor([width], [height]);
imagesavealpha($output , true);

$trans_colour = imagecolorallocatealpha($output , 0, 0, 0, 127);
imagefill($output , 0, 0, $trans_colour);

Теперь изображение прозрачное:)

Весь сценарий:

$output = imagecreatetruecolor([width], [height]);
imagesavealpha($output , true);

$trans_colour = imagecolorallocatealpha($output , 0, 0, 0, 127);
imagefill($output , 0, 0, $trans_colour);

header('Content-Type: image/png');

imagepng($output);

imagedestroy($output);

Надеюсь, это поможет!

...