Выбор правильного формата для сохранения ваших изображений имеет решающее значение для сохранения качества изображения и уменьшения артефактов. Различные форматы следуют разным методам сжатия и имеют свои преимущества и недостатки.
Например, JPG подходит для реальных фотографий, богатых цветными градиентами. PNG без потерь, с другой стороны, намного превосходит схематические фигуры:
Выбор правильного формата может быть непростой задачей при работе с большим количеством файлов. Вот почему я хотел бы найти способ автоматизировать его.
Немного предыстории моего конкретного случая использования:
Я работаю над несколькими раздаточными материалами для серии лекций в моем университете. В раздаточном материале много рисунков, которые я должен извлечь из слайдов в формате PDF. Извлечение этих изображений дает мне PNG без потерь, которые иногда слишком велики.
Преобразование этих конкретных файлов в JPEG может уменьшить их размер до менее чем 20% от их исходного размера при сохранении того же качества. Это важно, так как работа с сотнями больших изображений в текстовых процессорах довольно подвержена сбоям.
Пакетное преобразование всех извлеченных PNG-файлов в JPEG-файл не является вариантом, которому я хочу следовать, поскольку многие, если не большинство изображений, лучше подходят для форматирования в формате PNG. Их преобразование приведет к незначительному уменьшению размера, а иногда даже к увеличению размера файла - по крайней мере, так показали мои тесты.
Из этого можно сделать вывод, что размер файла после сжатия может служить индикатором того, какой формат лучше всего подходит для конкретного изображения. Это не очень точный предсказатель, но работает достаточно хорошо. Так почему бы не использовать его в виде скрипта:
Я включил inotifywait, потому что предпочел бы, чтобы скрипт выполнялся автоматически, как только я перетащил извлеченное изображение в папку.
Это более простая версия скрипта, которую я использовал последние пару недель:
#!/bin/bash
inotifywait -m --format "%w%f" --exclude '.jpg' -r -e create -e moved_to --fromfile '/home/MHC/.scripts/Workflow/Conversion/include_inotifywait' | while read file; do mogrify -format jpg -quality 92 "$file"
done
Продвинутая версия скрипта должна была бы
- уметь обрабатывать пробелы в именах файлов и каталогов
- сохранить оригинальные имена файлов
- сглаживать изображения PNG, если установлено альфа-значение
- сравнить размер файла между временно преобразованным изображением и его оригиналом
- определить, больше ли разница, чем заданный процент
- Действуй соответственно
Фактическое преобразование может быть сделано с помощью инструментов imagemagick:
convert -quality 92 -flatten -background white file.png file.jpg
К сожалению, мои навыки в bash даже не настолько развиты, чтобы превратить приведенную выше схему в реальный сценарий, но я уверен, что многие из вас могут.
Моя репутация здесь довольно низкая, но я с радостью предоставлю самый полезный ответ с самой высокой наградой, которую я могу установить.
Ссылки: http://www.formortals.com/introduction-cnb-imageguide/, http://www.turnkeylinux.org/blog/png-vs-jpg.
Изменить: Также см. Мои комментарии ниже для получения дополнительной информации о том, почему я думаю, что этот скрипт будет лучшим решением проблемы, с которой я сталкиваюсь.