将 PNG32 文件转换为 PNG8 且不丢失 alpha 通道

将 PNG32 文件转换为 PNG8 且不丢失 alpha 通道

我正在使用 Linux,无法访问任何 Adob​​e 的“花哨”程序。

我正在尝试将带有 alpha 通道的现有 PNG32 图像转换为 PNG8。我尝试了以下方法:

  • convert original.png PNG8:new.png- 严重扭曲图像并仅保留二进制 alpha(非索引 alpha)
  • GIMP——同样失败,但是比 ImageMagick 产生更好的质量(良好的色彩量化器)。
  • pngcrush -rem alla -reduce -brute original.png new.png- 使图像更小但没有考虑量化(图像少于 256 种颜色),所以输出仍然是 PNG32。

我还可以尝试什么?

答案1

这个 PHP 脚本使用 libgd 完成了这个任务:

<?PHP

if(!isset($argv[1]) || !is_readable($argv[1])) {
    echo "Creates an 8-bit PNG from a 32-bit PNG\n\n";
    echo "Usage:\n";
    echo "\t" . $argv[0] . " input.png > output.png\n";
    echo "\t" . $argv[0] . " input.png output.png\n";
    die();
}

$inFile = $argv[1];
$outFile = $argv[2] or STDOUT;

$inImage = imagecreatefrompng($inFile);
$outImage = imagecreate(imagesx($inImage), imagesy($inImage));

imagecopy($outImage, $inImage, 0, 0, 0, 0, imagesx($inImage), imagesy($inImage));

imagepng($outImage, $outFile);

将其转储到文件中并运行:

php convert.php input.png output.png

答案2

我知道我有点迟了,但是最近这对我正在从事的一个网络项目造成了影响。

我用了pngnq进行批量转换,我的 PNG8 从未如此出色。事实上,使用最高采样率 ( -s 1) 时,结果几乎与完整的 PNG32 难以区分。

答案3

你的发行版可能包括pngquant。如果您无法使用 yum / apt-get 找到它,请访问网站。我认为这是您最好的选择。

如果你在使用 pngquant 时遇到问题,可以尝试png输出,但这只是一种猜测。我听说它在保留 alpha 通道方面做得很好,但速度可能比较慢。人们体验到的速度缓慢可能是因为默认的“策略”是“极端”,作者承认这很慢。

这是一个 Windows 程序,但据说有 Linux 端口,但 pngout 作者页面上的链接已过期。Linux 端口维护者 JonoF,维护此处的页面现在。

我必须承认我从未使用过它。祝你好运!

答案4

使用pngquant,但请确保您使用的是 1.6 以上的版本。最新版本具有非常好的量化器,在各种情况下都远胜于 PHP 的 libGD。

Debian wheezy 仍然包含13岁版本输出质量低下。好的 pngquant 包适用于 Debian 实验版和大多数其他 Linux 发行版。

如果您的发行版只有过时的pngquant,那么请使用pngnq

相关内容