Только PHP GD: PNG24+Alpha => PNG8 не сохраняет Alpha

Пожалуйста, не публикуйте код, который вы на самом деле не тестировали! Я потратил некоторое время на поиски этого ответа. В Stackru есть несколько похожих постов, но ничто из того, что я нашел, не может дать такой, казалось бы, простой результат.

pngquant очень хорош для определенных применений, но в этом случае у меня есть конкретное использование, которое я пытаюсь заполнить, что означает использование только общего PHP с установкой GD.

Теперь соответствующий код в полном объеме! Этот простой код создает цветное PNG-изображение с полупрозрачным альфа-каналом. Работает отлично, просто и эффективно!

<?php
$img = imagecreatetruecolor(50, 50);
imagesavealpha($img, true);
$color = imagecolorallocatealpha($img, 65, 65, 65, 20);
imagefill($img, 0, 0, $color);

header('content-type: image/png');
imagepng($img, 'test.png');
imagedestroy($img);

print file_get_contents('test.png');
?>

Следующий почти идентичный код создает 8-битный файл изображения PNG, к сожалению, данные альфа-канала теряются.

<?php
$img = imagecreatetruecolor(50, 50);
imagesavealpha($img, true);
$color = imagecolorallocatealpha($img, 65, 65, 65, 20);
imagefill($img, 0, 0, $color);
imagetruecolortopalette($img, false, 255); #this line missing in sample above
header('content-type: image/png');
imagepng($img, 'test.png');
imagedestroy($img);

print file_get_contents('test.png');
?>

Зная, что 8-битный PNG с альфа-каналом наглядно возможен, может ли PHP GD сделать это или нет? Похоже, что PHP GD не способен, что-то вроде Турции, но некоторые из вас гораздо более продвинуты, чем я, и могут узнать окончательный ответ так или иначе...

Заранее благодарю за любую помощь.

1 ответ

Я думаю тебе следует позвонить imagesavealpha после преобразования палитры новая / преобразованная палитра "адаптируется" с альфа-значениями. Это должно работать:

<?php
$img = imagecreatetruecolor(50, 50);

$color = imagecolorallocatealpha($img, 65, 65, 65, 20);
imagefill($img, 0, 0, $color);
imagetruecolortopalette($img, false, 255);

imagesavealpha($img, true);

header('content-type: image/png');
imagepng($img, 'test.png');
imagedestroy($img);

print file_get_contents('test.png');
?>
Другие вопросы по тегам