zaLinux.ru

Как уменьшить размер фотографий. Массовое сжатие фотографий в командной строке


Как уменьшить размер изображения

Вы можете уменьшить размер изображения несколькими способами:

1. Выбрать формат кодирующий изображение с потерей качества (JPEG)

2. Увеличить уровень сжатия изображения (для изображений сжимаемых с потерей качества это приведёт к ухудшению вида изображения, для изображений сжимаемых без потери качества это будет означать более долгую обработку изображения)

3. Уменьшить размер изображения в пикселях. Это повлияет на чёткость изображения и возможность разглядеть мелкие детали.

Изменение размера и разрешения изображения

Чтобы указать размер изображения в пикселях используйте утилиту magick с опцией -scale ПИКСЕЛИ. Данная опция устанавливает ширину выходного изображения, что касается высоты, то она будет выбрана автоматически для сохранения исходной пропорции картинки.

Пример команды:

magick IMAGE.jpg -scale 150 COMPRESSED.jpg

Утилита magick является частью пакета ImageMagick. Подробности по установке ImageMagick, в том числе какие зависимости необходимо установить для поддержки максимального количества форматов, а также описание структуры команды и всех опций смотрите в статье: Руководство по ImageMagick: установка, использование и решение проблем

Если вы хотите чтобы изображение изменяло размер только если оно больше определённого размера, то используйте опцию -scale со знаком «больше» (>), который вместе с числом необходимо поместить в кавычки. Например, следующая команда уменьшить размер изображения до 500 пикселей в ширину только если изображение больше 500 пикселей.

magick IMAGE.jpg -scale '>500' size.jpg

Если использовать команду без знака «больше» (>), то размер изображения будет установлен на 500 пикселей, независимо от его начального размера. То есть размер изображения меньше 500 пикселей, то его ширина будет установлена на 500 пикселей следующей командой:

magick IMAGE.jpg -scale '500' size.jpg

Подробности смотрите в разделе Геометрия изображений.

Опция -scale увеличивает изображения с помощью усреднения пикселей. При уменьшении изображения пиксели просто удаляются. Никакие фильтры изображения не применяются.

Кроме этой опции имеются ещё следующие:

  • -resize ГЕОМЕТРИЯ — изменяет размер изображения, учитывает фильтры (опция -filter)
  • -sample ГЕОМЕТРИЯ — изменяет изображение с субдискретизацией пикселей и репликацией пикселей соответственно. Не учитывает фильтры. Ключевой особенностью -sample является то, что в результирующее изображение не добавляются новые цвета, хотя некоторые цвета могут исчезнуть.
  • -resample ГЕОМЕТРИЯ — изменяет разрешение изображения, работает с количеством точек на дюйм

Изменение степени сжатия изображения

Опция -quality устанавливает уровень сжатия изображений, сохраняемых без потерь качества, либо устанавливает уровень качества изображений, сохраняющихся с потерями.

При конвертации в некоторые форматы вы можете использовать опцию -quality КАЧЕСТВО. В качестве КАЧЕСТВА укажите число в диапазоне от 1 (худшее качество) до 100 (лучшее качество). Например:

magick IMAGE.jpg -quality 40 COMPRESSED.jpg

Опция -quality применима для форматов JPEG, MIFF, TIFF, PNG, MNG.

Для форматов сохраняющих изображения с потерей качества (JPEG) эта опция устанавливает степень качества — чем ниже качество, тем больше потерь при сжатии, но и меньше размер.

Для других форматов, кодирующих изображение без потерь, эта опция устанавливает степень сжатия.

Для форматов изображений JPEG и MPEG качество составляет от 1 (самое низкое качество изображения и максимальное сжатие) до 100 (наилучшее качество, но наименее эффективное сжатие). По умолчанию используется предполагаемое качество вашего входного изображения, если его можно определить, в противном случае — 92. Когда качество больше 90, каналы цветности не понижаются. Используйте параметр -sampling-factor, чтобы указать факторы для понижения дискретизации цветности.

Для формата изображения JPEG-2000 качество сопоставляется с помощью нелинейного уравнения коэффициенту сжатия, требуемому библиотекой Jasper. Это нелинейное уравнение предназначено для грубой аппроксимации качества, обеспечиваемого форматом JPEG v1. Значение качества по умолчанию 100, то есть запрос на сжатие без потерь. При качестве 75 запрашивается сжатие 16:1.

Для форматов изображений MNG и PNG значение качества задаёт уровень сжатия zlib (качество / 10) и тип фильтра (качество % 10). «Качество» PNG по умолчанию равно 75, что означает уровень сжатия 7 с адаптивной фильтрацией PNG, если только изображение не имеет карты цветов, и в этом случае это означает уровень сжатия 7 без фильтрации PNG.


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

Если тип фильтра равен 4 или меньше, указанный тип фильтра PNG используется для всех строк развёртки:

0 none
1 sub
2 up
3 average
4 Paeth

Если тип фильтра равен 5, адаптивная фильтрация используется, когда качество выше 50 и изображение не имеет карты цветов, в противном случае фильтрация не используется.

Если тип фильтра равен 6, используется адаптивная фильтрация с минимальной суммой абсолютных значений.

Только если выход MNG, если тип фильтра равен 7, используются преобразование цвета LOCO (внутрипиксельное различие) и адаптивная фильтрация с минимальной суммой абсолютных значений.


Если тип фильтра равен 8, стратегия сжатия zlib Z_RLE (или стратегия Z_HUFFMAN_ONLY, когда уровень сжатия равен 0) используется с адаптивной фильтрацией PNG.

Если тип фильтра равен 9, используется стратегия сжатия zlib Z_RLE (или стратегия Z_HUFFMAN_ONLY, когда уровень сжатия равен 0) без фильтрации PNG.

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

Не все комбинации уровня сжатия, стратегии и типа фильтра PNG можно получить с помощью параметра -quality. Для более точного контроля вы можете использовать определения PNG:compression-level=N, PNG:compression-strategy=N и PNG:compression-filter=N соответственно. Смотрите опцию -define. Значения из -define. имеют приоритет над значениями из опции -quality.

Для получения дополнительной информации смотрите спецификацию PNG.


Для форматов изображений MIFF и TIFF качество/10 — это уровень сжатия Zip/BZip, от 0 (наихудшее, но самое быстрое сжатие) до 9 (наилучшее, но самое медленное). На внешний вид изображения это никак не влияет, так как сжатие всегда происходит без потерь.

Для формата изображения BPG качество/2 — это фактический уровень сжатия BPG (диапазон от 0 до 51).

Массовое изменение размера фотографий в командной строке

Утилита magick прекрасно подходит для массового преобразования большого количества файлов.

Предположим, имеется задача обработать все JPG файлы в текущей директории так, чтобы уменьшить их размер до 100 пикселей и сохранить в папке «preview», при этом каждый файл должен сохранить своё имя.

Прежде всего, обратим внимание, что для того, чтобы не указывать каждый файл отдельно, мы будем использовать «Подстановочные символы в имени файла», то есть в качестве входного файла мы укажем «*.jpg».

Также вместо опции -scale мы будем использовать «Изменение размера изображения во время чтения», то есть желаемый размер изображения будет указан в квадратных скобках после шаблона имени файла. Таким образом, именем файла становится «*.jpg[100x]», поскольку мы хотим изменить размер до 100 пикселей.

Обратите внимание, что такой подход с заменой -scale на изменение изображения во время чтения позволит очень сильно сэкономить ресурсы компьютера (оперативную память), поскольку все изображения будут обрабатываться последовательно, без предварительного чтения их в оперативную память.

В качестве выходного файла мы будем использовать «Указание шаблона имени файлов».

Некоторые «свойства» должны быть определены особым образом для использования. Например, только «свойства» с префиксом «filename:» могут использоваться для изменения выходного имени файла изображения.

Создадим директорию preview:

mkdir preview

Следующая команда поочерёдно считает все файлы .jpg в текущей директории, изменит их размер до 100 пикселей и сохранит их в директорию preview с прежними именами:

magick *.jpg[100x] -set filename:currentfile '%t' 'preview/%[filename:currentfile].jpg'

%t означает исходное имя файла без расширения. Список возможных атрибутов и их условные обозначения в виде экранированных символов вы найдёте по ссылке: https://imagemagick.org/script/escape.php

Если вы хотите, чтобы к исходному имени файла также были добавлены данные о ширине и высоте, то используйте следующую команду:

magick *.jpg[100x] -set filename:currentfile '%t-%wx%h' 'preview/%[filename:currentfile].jpg'

В этой команде используются %w (ширина) и %h (высота).

Если вы хотите, чтобы размер изображения был уменьшен только если он превышает указанный размер, тогда к выбранному размеру добавьте символ «>»:

magick '*.jpg[1000x>]' -set filename:currentfile '%t-%wx%h' 'preview/%[filename:currentfile].jpg'

Больше примеров указания размера изображений смотрите в разделе «Геометрия изображений».

Сжатие изображений без изменения их размера

Кроме изменения количества пикселей в изображении, хороших результатов по уменьшению размера, которое занимает фотография, без особого потеря качества является уменьшение уровня качества, фактически, уровня сжатия.

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

Смотрите также: Как узнать уровень качества JPG


В следующем примере все файлы JPEG будут сжаты с качеством 40 и сохранены в папке compressed с теми же самыми именами:

mkdir compressed
magick *.jpg -quality 40 -set filename:currentfile '%t' 'compressed/%[filename:currentfile].jpg'

Как запретить сохранение всех картинок в один файл

Форматы JPEG и PNG не поддерживает файлы с несколькими изображениями, поэтому рассмотренная проблема не возникает при конвертировании в эти форматы. Но ряд форматов, например, GIF, MIFF, TIFF, PDF, MNG, HEIF и HEIC, поддерживают файлы с несколькими изображениями. В этом случае все изображения по умолчанию будут сохранены в один файл.

Смотрите также: Что такое формат изображения HEIF (или HEIC)?

Чтобы сохранять каждое изображение в отдельный файл, добавьте к вашей команде опцию +adjoin, например:

magick '*.jpg[1000x>]' -set filename:currentfile '%t-%wx%h' +adjoin 'heif/%[filename:currentfile].heif'

Рекомендуемые статьи:

Оставить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *