PHP + GD: imagetruecolortopalette не сохраняет прозрачность
Я использую GD для вывода изображения в формате PNG с истинным цветом + альфа-каналом, используя imagepng просто отлично. Тем не менее, я хотел бы также иметь возможность выводить 256-цветной PNG, совместимый с ie6. Согласно официальной документации для imagetruecolortopalette:
Код был изменен, чтобы сохранить как можно больше информации альфа-канала в результирующей палитре, в дополнение к максимально возможному сохранению цветов.
Тем не менее, я считаю, что результаты этой функции вообще не сохраняют никакой прозрачности. Я использовал это изображение Firefox с текстом, наложенным поверх него, в качестве теста, и все функции, которые он сделал, дали мне белый фон и странную синюю рамку. Я знаю, что не могу надеяться сохранить полный альфа-канал, но наверняка эта функция по крайней мере подхватит прозрачный фон. Я что-то упускаю? Есть ли альтернативные подходы, которые я могу использовать?
2 ответа
Я недавно сталкивался с чем-то вроде этого - я мог только заставить работать прозрачность, используя:
imagesavealpha($im, true);
imagecolortransparent($im, imagecolorat($im,0,0));
Я знал, что на всех изображениях верхний левый пиксель будет цветом фона. Они были названы после imagetruecolortopalette и перед imagepng.
Я смог сохранить прозрачность, сохраняя пиксели до того imagetruecolortopalette
с
function check_transparent($im) {
$width = imagesx($im);
$height = imagesy($im);
$pixels = array();
for($i = 0; $i < $width; $i++) {
for($j = 0; $j < $height; $j++) {
$rgba = imagecolorat($im, $i, $j);
$index = imagecolorsforindex($im, $rgba);
if($index['alpha'] == 127) {
$pixels[] = array($i, $j);
}
}
}
return $pixels;
}
затем заменить на
function replacePixels($im,$pixels){
$color = imagecolorallocatealpha($im, 0, 0, 0, 127);
foreach($pixels as $pixel)
imagesetpixel($im, $pixel[0], $pixel[1], $color);
}
как
$tpixels = check_transparent($image);
imagetruecolortopalette($image, true, 255);
replacePixels($image, $tpixels);
Взгляните на imagesavealpha в php-документации - я думаю, это то, что вы ищете.