Преобразование файла PNG32 в формат PNG8 без потери альфа-канала

4080
LiraNuna

Я использую 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
Josh

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

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

Какая полезная ссылка, спасибо! Я давно искал такой инструмент. Протестировал pngnq и он дает отличный результат, небольшой файл и плавную альфу. jjrv 12 лет назад 0
1
DaveParillo

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

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

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

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

`pngquant` не сохраняет альфа-канал. Он выдает тот же результат, что и GIMP. LiraNuna 15 лет назад 0
`pngout` не будет сотрудничать -` Невозможно сжимать дальше: копирование исходного файла` LiraNuna 15 лет назад 0
Вот это да. Вы можете сделать это изображение доступным где-нибудь? Я бы хотел попробовать. DaveParillo 15 лет назад 0
Просто возьмите любое изображение PNG32, на самом деле я использую одну из иконок из набора иконок Silk - http://www.famfamfam.com/lab/icons/silk/. LiraNuna 15 лет назад 0
Все значки в famfamfam_silk_icons_v013.zip выглядят как 8-битные. У меня проблемы с поиском 32-битного изображения в Интернете. Я не хочу делать это самостоятельно, используя инструменты, которые вызывают у вас горе, потому что это вряд ли верный тест. DaveParillo 15 лет назад 0
нашел 32-битное изображение с, я думаю, всем возможным набором уровней прозрачности: http://www.virtualmechanics.com/support/tutorials-spinnerpro/image/obj4120geo2655shd297pg5p6.png. Теперь я вижу вашу проблему ;-) DaveParillo 15 лет назад 0
1
strager

Этот 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
Kornel

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

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

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

Похожие вопросы