Как выполнить пакетную обработку изображений JPG, чтобы изменить их качество с помощью Nautilus-Actions?

Прежде всего: Спасибо, что нашли время, чтобы прочитать это и оказать некоторую помощь. Любые советы приветствуются.

Я использую Nautilus-Actions, чтобы добавить действие пользовательского контекстного меню, чтобы создать копию изображения JPG и снизить его качество (и размер файла), сохранив размеры изображения.

Скажем так: у меня есть эта картинка со свойствами картинки размером 2,3 МБ (2 261 588 байт) и:

введите описание здесь

И, после открытия файла в GIMP 2.8, чтобы просто экспортировать копию и использовать диалоговое окно JPG Export, чтобы снизить качество изображения до 30%, как показано на следующем снимке экрана:

введите описание здесь

Я получаю следующие свойства изображения в копии изображения (размер файла 251,8 КБ (251 797 байт)):

введите описание здесь

Сейчас.

Я использую Nautilus Actions для пакетной обработки большого количества изображений, чтобы воспроизвести то же поведение через контекстное меню, выбрав несколько файлов в Nautilus, щелкнув правой кнопкой мыши по любому из этих выбранных файлов и выбрав правильное действие Nautilus Actions. В результате получается файл, содержащий изображение в тех же размерах, что и оригинал, с меньшим качеством, конечно, и размер файла немного больше (размер файла 275,3 КБ (275 265 байт)), но это не является для меня большой проблемой.

Эта проблема

Происходит, когда я пытаюсь выполнить пакетную обработку нескольких файлов изображений, в результате первое имя файла клонируется в несколько имен файлов, содержащих разные изображения каждый. Со свойствами, которые я установил в следующем наборе команд:

введите описание здесь

По сути, каждое действие Nautilus использует следующие параметры:

Команда: convert

  • От (imagemagick)

Параметры: %F.jpg -quality 80%% %F-80q.jpg

  • Что интерпретируется как: convert path/to/file1.mid.jpg -quality=80% path/to/file1.mid-80q.jpg

Рабочий каталог: %d

  • Объяснил сам.

Итак, результаты можно увидеть на этом снимке экрана:

введите описание здесь

Здесь мы видим, что каждое изображение обрабатывается в отдельном файле, но только первое имя файла используется для назначения новых имен скопированным файлам. Я желаю результат, как:

File1.jpg === File1-80q.jpg
File2.jpg === File2-80q.jpg
File3.jpg === File3-80q.jpg
File4.jpg === File4-80q.jpg

И так далее...

Я использовал Phatch для выполнения таких задач, но мне нужно лишь щелкнуть правой кнопкой мыши выбранные файлы и обработать их одним действием.

Есть ли лучший способ сделать это? или... Могу ли я каким-то образом улучшить то, что я уже делаю?

Спасибо большое за вашу поддержку.

PS Я видел, как я могу конвертировать изображения в ч / б, сохраняя структуру папок, и есть ли способ пакетного экспорта SVG в PNG? но я не пытаюсь запустить это из терминала, а из контекстного меню. Если я пропущу что-то в этом упражнении, не стесняйтесь, дайте мне знать! Я буду очень благодарен. Спасибо!

редактировать

После использования ответа Муру я обнаружил, что решение частично выполняет то, что я ожидаю.

Более конкретно, это решает проблему с именами файлов. Тем не менее, я также ожидал получить меньший размер файла, запустив convert file.jpg -quality 30% команда, и он сбрасывает файлы большего размера, как вы можете видеть на следующем изображении:

введите описание здесь

Кто-нибудь знает, есть ли что-то еще, что я должен добавить к параметрам, увиденным в ответе Муру? Я высоко ценю ваши усилия по оказанию помощи в этом вопросе.

Обновить

Я пишу это просто, чтобы люди знали, что я видел, где была проблема со сжатием. Файл, который я пытался сжать, был уже достаточно сжат, поэтому (как упоминалось в ответе Муру):

Процесс просто добавлял накладные расходы, ничего не получая.

1 ответ

Решение

Вы не можете использовать %F дважды в такой команде, потому что %F заменяется именами каждого выбранного файла. Например, команда sh с параметрами -c 'printf "%%s\n" "$@" > foo' %F %F создаст файл с именем foo с именами каждого выбранного файла, дважды. Следовательно convert Команда, которая на самом деле работает:

convert file1.jpg file2.jpg ... -quality 80% file1.jpg file2.jpg ... fileN.jpg-80q.jpg

И поскольку последний файл считается именем выходного файла, это будет иметь значение только для него.

Что вы можете сделать, это обернуть вашу команду в bash -c и запустить цикл for:

bash -c 'for i; do convert "$i" -quality 80% "${i/%.jpg/-80q.jpg}"; done'

(где я предполагаю, что все файлы заканчиваются .jpg)

В действии у вас будет bash как команда, так и для параметров:

-c 'for i; do convert "$i" -quality 80%% "${i/%%.jpg/-80q.jpg}"; done' - %F

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

Другие вопросы по тегам