imagemagick изменение размера и качества PNG

#image #image-processing #png #imagemagick

#изображение #обработка изображений #png #imagemagick

Вопрос:

В моем приложении мне нужно изменить размер и ухудшить качество файлов PNG.

В полном размере PNG-файлы имеют размер 3100x4400px и занимают 2,20 МБ дискового пространства.

При выполнении следующей команды:

 convert -resize 1400 -quality 10 input.png output.png
 

изображения изменены до 1400×2000, используя 5,33 МБ дискового пространства.

Итак, мой вопрос: как я могу уменьшить размер файла?

Комментарии:

1. Вы можете изменять размер, пока не получите достаточно маленький размер файла. Вы можете ограничить количество цветов и сохранить как палитру 8-битного цвета. (см imagemagick.org/script/command-line-options.php#colors и imagemagick.org/Usage/formats/#png_formats ). Вы можете постеризировать цвета. Вы можете использовать различные типы / значения сжатия (см. imagemagick.org/script/command-line-options.php#quality ), хотя это, скорее всего, не будет иметь большого значения.

Ответ №1:

  1. Вы можете еще больше снизить качество PNG, используя постеризацию:

    https://github.com/pornel/mediancut-posterizer (Графический интерфейс Mac)

    Это операция с потерями, которая позволяет zlib лучше сжимать.

  2. Преобразуйте изображение в PNG8 с помощью pngquant.

    Это уменьшает изображения до 256 цветов, поэтому качество зависит от типа изображения, но pngquant создает очень хорошие палитры, поэтому вы можете быть удивлены, как часто это работает.

  3. Используйте Zopfli-png или AdvPNG для лучшего повторного сжатия изображений.

    Это без потерь и рекомендуется для всех изображений, если у вас есть свободные циклы процессора.

Комментарии:

1. Вы также можете использовать convert source.png png8:dest.png для преобразования в PNG8

2. Конвертер ImageMagick довольно плох и не поддерживает прозрачность должным образом: imagemagick.org/discourse-server/viewtopic.php?t=23340

3. есть ли какой-либо способ сгенерировать png с определенным ограничением размера файла, например jpg -определить jpeg: extent = 70 КБ

4. Нет, PNG в целом не подходит для сжатия для определенного размера файла, поэтому единственное, что вы можете сделать, это сжать несколько раз с разными настройками и выбрать один из результатов, наиболее близкий к желаемому размеру. Но сжатие до фиксированного размера файла в большинстве случаев является очень плохой идеей , поскольку это приведет к слишком плохому качеству сложных файлов и потере места на простых изображениях.

Ответ №2:

После использования imagemagick для изменения размера вы можете сжать изображение с помощью pngquant .

На Mac (с homebrew) brew install pngquant затем:

 pngquant <filename.png>
 

Это создаст новое изображение filename-fs8.png , которое обычно намного меньше по размеру.

Ответ №3:

На странице справки говорится, что -quality опция, используемая с PNG, устанавливает уровень сжатия для zlib, где (примерно) 0 — худшее сжатие, 100 — лучшее (по умолчанию 75). Поэтому попробуйте установить -quality значение 100 или даже удалить эту опцию.

Другой метод заключается в определении PNG:compression-level=N PNG:compression-strategy=N и PNG:compression-filter=N достижении еще лучших результатов.

http://www.imagemagick.org/script/command-line-options.php#quality

Ответ №4:

Для ленивых людей, которые прибыли сюда, желая вставить однострочный:

 mogrify -resize 50% -quality 50 *.png amp;amp; pngquant *.png --ext .png --force 
 

Это изменяет все png в текущем каталоге на месте, поэтому убедитесь, что у вас есть резервная копия. Измените размер и параметры качества в соответствии с вашими потребностями. Я провел быстрый эксперимент и сначала mogrify, а затем pngquant, что привело к значительному уменьшению размера изображения.

Пакет ubuntu для pngquant называется «pngquant», но я установил его уже на 20.04LTS, поэтому кажется, что он может быть там по умолчанию.

Комментарии:

1. Отлично. Также работал как шарм на компьютере Mac. Я просто использовал немного больше качества, так как 50% — это слишком много. в любом случае, любой может играть со своими.

Ответ №5:

Я обнаружил, что лучшим способом было использовать

 - density [value] 
 

параметр.