dtdb99743 2013-08-24 17:12
浏览 36

仅限PHP GD:PNG24 + Alpha => PNG8不保存Alpha

Please do not post code which you have not actually tested! I have spent some time looking for this answer. There are several similar posts here on StackOverflow, but nothing I have found can produce this seemingly simple result.

pngquant is very nice for certain uses, but in this case, I have a specific use which I am trying to fill, which means using only the generic PHP with GD install.

Now the relevant code in its entirety! This simple code, produces a high color PNG image, with a translucent alpha channel. Works great, simple and effective!

<?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');
?>

The following, nearly identical code, produces an 8bit PNG image file, unfortunately, the Alpha channel data is lost.

<?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');
?>

Knowing that an 8bit PNG with alpha channel is demonstrably possible, can PHP GD do it, or not? It appears PHP GD is incapable, a bit of a turkey, but some of you are far more advanced than I am and may know the definitive answer one way or the other...

thanks in advance for any help.

  • 写回答

1条回答 默认 最新

  • dtfo55908 2013-08-24 17:33
    关注

    I think you should call imagesavealpha after you did the palette conversion, so the new/converted palette is "adapted" with alpha values. This should work:

    <?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');
    ?>
    
    评论

报告相同问题?

悬赏问题

  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私
  • ¥15 ROS系统搭建请教(跨境电商用途)
  • ¥15 AIC3204的示例代码有吗,想用AIC3204测量血氧,找不到相关的代码。