Автоматизация, Программирование

Сжимаем всё и сразу: изображения

Время прочтения: 5 мин.

Предыдущие статьи на тему сжатия файлов мультимедиа

Для компрессии изображения мы будем использовать пакет для обработки графики

ImageMagick ImageMagick для Windows можно скачать по ссылке .

На этой странице найдите раздел «Windows Binary Release» и в нём ссылку на скачивание файла ImageMagick-х.х.х-хх-portable-Q16-x86.zip (где х.х.х-хх — номер последней версии ПО), или ImageMagick-х.х.х-хх-portable-Q16-x64 (в зависимости от версии используемой вами операционной системы, 32- (x86) или 64-битной (x64)).

Скачайте необходимый файл. Для дальнейшей работы нам потребуется файл convert.exe, который находится в корневой папке скачанного архива.

Далее проделываем всё точно так же, как и раньше при обработке видеофайлов. Можно даже использовать уже созданные ранее для этого папки.

  1. Создайте пустую папку, в которой в дальнейшем будете производить обработку графических файлов. Для удобства опять назовём эту папку WORK.
  2. В папке WORK создайте — да, всё правильно, две папки IN и OUT.
  3. Распакуйте файл convert.exe из скачанного архива в папку WORK.
  4. Скопируйте в папку WORK\IN графический файл, который вы хотите сжать. Для удобства условимся, что этот файл называется image.jpg.
  5. В папке WORK создайте текстовый файл convert.bat. В текстовом редакторе запишите в него команду:

convert.exe in\image.jpg -quality 60 -filter Lanczos -sampling-factor 4:2:0 -define jpeg:dct-method=float -thumbnail x1080 out\image.jpg

6. Сохраните и закройте файл convert.bat, затем запустите его. Программа convert.exe не столь говорлива, как ffmpeg.exe, поэтому на экране появится пустое чёрное окно, просто говорящее нам о том, что процесс обработки изображения запущен.

После завершения работы конвертора окно исчезнет, а в папке OUT будет находиться сжатый файл image.jpg. В зависимости от размеров, качества и параметров сжатия исходного файла, размер сконвертированного файла может быть от 5 до 20 раз меньше исходного.

Рассмотрим подробнее параметры команды, которую мы записали в файле convert.bat.

convert.exe Собственно имя самого запускаемого конвертора
in\image.avi Имя исходного файла (аналогично имени исходного файла при обработке
видео)  
-quality Ключ, который говорит о том, что следующий элемент команды
будет значением уровня сжатия изображения
60 Уровень сжатия изображения, который следует за ключом –quality,
измеряется в процентах. 100 — максимально возможное качество, далее,
чем число меньше, тем качество хуже (но при этом размер конечного
файла — меньше). Аналогично видео, при выборе качества сжатия
изображения нужно находить разумный компромисс между качеством и размером. Экспериментально установлено, что для нашей задачи качество
60 – оптимальное, чтобы ухудшение изображения ещё не начало
быть слишком заметным
-filter Ключ, который говорит о том, что следующий элемент команды будет
названием фильтра обработки изображения при изменении его размера
Lanczos Название фильтра обработки изображения, которое следует за ключом
-filter. Означает алгоритм, с помощью которого будет происходить
сглаживание дефектов изображения, возникающих при изменении
его размера. Фильтр Lanczos (названный в честь венгерского математика
Корнелиуса Ланцоша, работавшего в области обработки цифровых
сигналов) даёт при этом наилучшее качество
-sampling-factor 4:2:0 -define jpeg:dct-method=float Набор ключей, описывающих способы кодирования цвета при сжатии
изображения больше, чем на 10% (ключ –quality от 90 и меньше).
Подробно описывать все параметры не будем, достаточно запомнить,
что их нужно использовать именно так, как они здесь записаны
-thumbnail Ключ, который говорит о том, что следующий элемент команды
будет размером, до которого нужно уменьшить (или растянуть) исходное
изображение
x1080 Высота изображения, к которой (пропорционально) нужно привести
исходное изображение. В данном случае – к высоте 1080 пикселей
по вертикали. Также можно задать ширину, к которой (тоже
пропорционально) нужно привести исходное изображение.
В этом случае будет нужно указать символ «x» (латинскую букву) —
слева от числа, например, 1920x – преобразовать изображение
к ширине 1920 пикселей по горизонтали. Также можно принудительно,
не пропорционально, преобразовать изображение
к произвольному размеру, например 2000 пикселей на 1000 пикселей,
указав значение ключа как 2000×1000.
out\image.jpg И последний элемент команды — всегда имя сконвертированного
файла. Для него действуют те же правила записи, что и для исходного

Возможностей у программы convert и другого ПО из пакета ImageMagick не меньше, а даже больше, чем у ffmpeg (среди которых, например, есть команды преобразования и сборки исходных графических файлов в документ PDF, обратное преобразование из PDF в изображение, преобразование файла изображения в текст с распознаванием и т.п.). Более подробная справка по работе с ImageMagick и примеры команд (на английском языке) находятся на официальном сайте проекта.

К сожалению, полноценной русскоязычной документации в природе не существует, поэтому для каждого конкретного случая придётся пользоваться Google или Яндексом — в интернете можно найти множество примеров использования утилит пакета.

Автоматизацию процесса обработки всех исходных файлов изображений, которые находятся в папке IN, сделаем аналогично обработке видеофайлов, с помощью JScript-скрипта.

Для этого в папке WORK создайте текстовый файл convert.js. В текстовом редакторе вставьте в него следующий программный код:

fso=new ActiveXObject("Scripting.FileSystemObject"); //создаём объект fso для работы с файлами
WshShell=WScript.CreateObject("WScript.Shell"); //создаём объект для работы с окружением
WorkScriptPath=fso.GetParentFolderName(WScript.ScriptFullName); //получаем имя каталога скрипта
//Получаем список файлов в каталоге IN
fin=fso.GetFolder("in\\"); //создаем объект f со свойствами каталога IN
fc=new Enumerator(fin.files); //создаем объект fc, содержащий список файлов в каталоге IN
for (; !fc.atEnd()==true; fc.moveNext()) //двигаемся по этому списку до последней записи
{ 
  fn=fso.GetFileName(fc.item()); //извлекаем имя исходного файла без пути
  //заменяем расширение конечного файла на JPG
  if (fn.substr(fn.length-4, 1)==".") fn2=fn.substr(0, fn.length-3)+"jpg"
    else fn2=fn.substr(0, fn.length-4)+"jpg"
  //формируем строку команды конвертации очередного файла (можете попробовать поменять какие-нибудь параметры строки команды convert)
  command_string=WorkScriptPath+
    "\\convert.exe "+"\""+WorkScriptPath+"\\in\\"+fn+"\""+
    " -quality 60 -filter Lanczos -sampling-factor 4:2:0 -define jpeg:dct-method=float -thumbnail x1080 "+
    "\""+WorkScriptPath+"\\out\\"+fn+"\"";
  result=WshShell.Run(command_string, 1, true); //выполняем команду конвертации
}

Теперь, если запустить скрипт convert.js, мы увидим открывающиеся и закрывающиеся окна утилиты convert. Когда последнее окно закроется, в папке OUT будут лежать все сжатые файлы изображений.

Итак, надеюсь, что вам были полезны приёмы, описанные в этой и предыдущей статьях. На самом деле, случаи, которые мы рассмотрели, представляют собой лишь малую толику того, что можно сделать, используя все возможности FFMpeg и ImageMagick. Изучив способы и примеры применения этих программ, вы получите в своё распоряжение мощные инструменты для решения большинства задач, связанных с обработкой видео и графики.

Советуем почитать