4

Я использую Linux и не имею доступа ни к одной из «модных» программ Adobe.

Я пытаюсь преобразовать существующее изображение PNG32 с альфа-каналом в PNG8. Я пробовал следующие методы:

  • convert original.png PNG8:new.png - Ужасно искажает изображение и сохраняет только двоичную альфу (не проиндексированная альфа)
  • GIMP - также не работает, но дает лучшее качество (хороший цветовой квантователь), чем ImageMagick.
  • pngcrush -rem alla -reduce -brute original.png new.png - Уменьшил изображение, но не принял во внимание квантование (в изображении меньше 256 цветов), поэтому вывод был в формате PNG32.

Что еще я могу попробовать?

4 ответа4

2

Я знаю, что немного опаздываю на вечеринку, но недавно я укусил меня в веб-проекте, над которым я работаю.

Я использовал pngnq для пакетного преобразования, и мой PNG8 никогда не выглядел лучше. На самом деле, при самой высокой частоте дискретизации (-s 1) результаты практически неотличимы от полного PNG32.

1

Ваш дистрибутив может включать pngquant. Если вы не можете найти его с помощью yum / apt-get, перейдите на веб-сайт. Я думаю, что это ваша лучшая ставка.

Если у вас есть проблемы с pngquant, вы можете попробовать pngout, но это долгий путь . Я слышал, что он хорошо справляется с сохранением альфа-канала, но может быть медленным. Возможно, люди испытывают медлительность из-за того, что «стратегия» по умолчанию - «Экстрим», что, как признает автор, медленный.

Это программа для Windows, но есть порты Linux (предположительно), но ссылка на странице авторов pngout устарела. Поддерживающий порт Linux, JonoF, теперь поддерживает страницу здесь .

Я должен признать, что никогда не использовал это. Удачи!

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
0

Используйте pngquant, но убедитесь, что у вас версия более поздняя, чем 1.6. В последней версии есть очень хороший квантователь, который в любом случае превзойдет libGD в PHP.

Debian wheezy по-прежнему содержит 13-летнюю версию с низким качеством вывода. Есть хороший пакет pngquant для экспериментального Debian и большинства других дистрибутивов Linux.

Если ваш дистрибутив имеет только устаревший pngquant , используйте вместо него pngnq .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .