4

У меня есть сжатый PNG compressed.png изображения. Я могу преобразовать его в несжатый PNG decompressed.png используя GIMP (сохранение в формате PNG и установка уровня сжатия в 0). Как это можно сделать в командной строке (Linux)?

Я помню, как делал это в прошлом, используя convert Imagemagick , но я забыл как. Я попробовал некоторые вещи, которые, по моему мнению, должны работать на основе документации:

  • convert compressed.png -compress None decompressed.png
  • convert compressed.png +compress decompressed.png
  • convert compressed.png -quality 0 decompressed.png
  • convert compressed.png -quality 00 decompressed.png

просто написал обычный сжатый PNG.

В сторону: зачем вам несжатый PNG?

Некоторые случаи:

  • Вы хотите поддерживать эффективную (двоичную) разность данных изображения, в то же время используя другие функции формата PNG (в отличие от хранения необработанных данных изображения или BMP).
  • Вы хотите сжать несколько PNG вместе в архиве tarball или 7z, но хотите продолжать использовать функции PNG. Если изображения достаточно похожи, это может дать лучшую степень сжатия, чем сжатие по отдельности.
  • Полезно в качестве базового размера для тестирования оптимизаторов PNG.

3 ответа3

5

Процитируем документ ImageMagick: не все комбинации уровня сжатия, стратегии и типа фильтра PNG могут быть получены с помощью опции -quality. Для более точного управления вы можете использовать опцию -define.

Например, эта команда должна создать несжатый (RGB) файл PNG:

convert INFILE \
-define png:compression-level=0 \
-define png:compression-filter=0 \
-define png:color-type=2 \
OUTFILE.png

Вы можете получить предупреждение, которое является безвредной ошибкой. Он все равно будет выдавать правильный png. http://www.imagemagick.org/discourse-server/viewtopic.php?f=1&t=20257

Образец изображения:

112233 112233 112233 112233
445566 445566 445566 445566
778899 778899 778899 778899
aabbcc aabbcc aabbcc aabbcc

Блок IDAT файла PNG, созданного с помощью IM:

49444154081d013400cbff00
11223311223311223311223300
44556644556644556644556600
77889977889977889977889900
aabbccaabbccaabbccaabbcc
7d6f14b9...

Однако для определенных случаев (например, групповое сжатие) может оказаться целесообразным протестировать формат с меньшими издержками, например, TARGA (.tga).

3

ImageMagick всегда сжимает файлы PNG. Худшее сжатие, которое вы можете получить, использует:

convert -verbose -quality 01 input.png output.png

но это зависит от содержимого изображения (0 будет использовать сжатие Хаффмана, которое иногда сжимает лучше, чем zlib).

Вы можете попробовать другие инструменты, такие как pngcrush (http://pmt.sourceforge.net/pngcrush/), чтобы отключить сжатие:

pngcrush -force -m 1 -l 0 input.png output.png

которые создают файл того же размера, который создается GIMP при использовании уровня сжатия 0 (несколько байтов больше или меньше).

Некоторые примеры размеров (для фотографического PNG, 1600x1200):

  • оригинал: 1 693 848 байт.
  • после IM: 2 435 983 байта.
  • после GIMP: 5,770,587 байт.
  • после pngcrush: 5,802,254 байта.
1

Мне нравится набор инструментов netpbm, он разработан в традиции UNIX "программные инструменты":«пишите программы, которые делают одно и делают это хорошо».

Вы можете сделать то, что вы просили, как это:

< in.png pngtopnm > image.pnm
< in.png pngtopnm -alpha > alpha.pnm
<image.pnm pnmtopng -alpha alpha.pnm -compression 0 > out.png
rm image.pnm alpha.pnm

Вы можете потерять определенные метаданные из исходного файла png.

Это кажется немного сложным из-за способа обработки альфа-канала.

Netpbm - это инструментарий для работы с графическими изображениями, включая преобразование изображений между различными форматами. В пакете более 220 отдельных инструментов, включая конвертеры для более чем 80 графических форматов.

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