Как создать изображение с прозрачным фоном - PullRequest
9 голосов
/ 09 декабря 2011

Как создать изображение с помощью GDlib с прозрачным фоном?

header('content-type: image/png');

$image = imagecreatetruecolor(900, 350);

imagealphablending($image, true);
imagesavealpha($image, true);

$text_color = imagecolorallocate($image, 0, 51, 102);
imagestring($image,2,4,4,'Test',$text_color);

imagepng($image);
imagedestroy($image);

Здесь черный фон

Ответы [ 6 ]

26 голосов
/ 09 декабря 2011

Добавьте строку

imagefill($image,0,0,0x7fff0000);

где-то перед imagestring, и она будет прозрачной.

0x7fff0000 разбивается на:

alpha = 0x7f
red = 0xff
green = 0x00
blue = 0x00

, котораяполностью прозрачный.

9 голосов
/ 09 декабря 2011

Как то так ...

$im = @imagecreatetruecolor(100, 25);
# important part one
imagesavealpha($im, true);
imagealphablending($im, false);
# important part two
$white = imagecolorallocatealpha($im, 255, 255, 255, 127);
imagefill($im, 0, 0, $white);
# do whatever you want with transparent image
$lime = imagecolorallocate($im, 204, 255, 51);
imagettftext($im, $font, 0, 0, $font - 3, $lime, "captcha.ttf", $string);
header("Content-type: image/png");
imagepng($im);
imagedestroy($im);
8 голосов
/ 09 декабря 2011

Вы должны использовать imagefill() и заполнить его выделенным цветом (imagecolorallocatealpha()), для которого альфа установлена ​​на 0.

Как сказал @mvds, «выделение не обязательно», если онодля полноцветного изображения (24 или 32 бита) это просто целое число, поэтому вы можете передать это целое число непосредственно в imagefill().

То, что PHP делает в фоновом режиме для полноцветных изображений при вызове imagecolorallocate(), одинакововещь - он просто возвращает это вычисленное целое число.

6 голосов
/ 04 октября 2017

Это должно работать. Это сработало для меня.

$thumb = imagecreatetruecolor($newwidth,$newheight);
$transparent = imagecolorallocatealpha($thumb, 0, 0, 0, 127);
imagefill($thumb, 0, 0, $transparent);
imagesavealpha($thumb, true);
imagecopyresampled($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
imagepng($thumb, $output_dir);
6 голосов
/ 19 января 2015

Это должно работать:

$img = imagecreatetruecolor(900, 350);

$color = imagecolorallocatealpha($img, 0, 0, 0, 127); //fill transparent back
imagefill($img, 0, 0, $color);
imagesavealpha($img, true);
1 голос
/ 08 июня 2013

Иногда вы не получите прозрачное изображение из-за проблем в изображении PNG. Изображение должно быть в одном из следующих рекомендуемых форматов:

PNG-8 (recommended)
Colors: 256 or less
Transparency: On/Off
GIF
Colors: 256 or less
Transparency: On/Off
JPEG
Colors: True color
Transparency: n/a

Функция imagecopymerge неправильно обрабатывает изображения PNG-24; поэтому не рекомендуется.

Если вы используете Adobe Photoshop для создания изображений водяных знаков, рекомендуется использовать команду «Сохранить для Web» со следующими настройками:

File Format: PNG-8, non-interlaced
Color Reduction: Selective, 256 colors
Dithering: Diffusion, 88%
Transparency: On, Matte: None
Transparency Dither: Diffusion Transparency Dither, 100%
...