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-документации - я думаю, это то, что вы ищете.

Другие вопросы по тегам