Пакетное добавление групп изображений с помощью imagemagick

Я хочу использовать ImageMagick's convertскрипт для добавления двух изображений по горизонтали.

Это легко сделать с convert +append input1.jpg input2.jpg output.jpg,

У меня есть каталог файлов JPEG, однако. Они выглядят так:

1996-0011-1 BEG Foo Bar Foo Bar.jpg
1996-0011-2 BEG Foo Bar Foo Bar.jpg
2001-0006-1 MEF FooBar.jpg
2001-0006-2 MEF FooBar.jpg
…

Первые четыре цифры - это год, следующие четыре цифры - это порядковый номер. -1 это левая часть, -2 правая часть предполагаемого выходного файла. Оставшаяся часть имени файла представляет собой строку с переменным количеством пробелов.

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

Я использую OS X. Спасибо за вашу помощь.

1 ответ

Решение

Предполагая две вещи:

  • У вас есть доступ к достаточно современной версии GNU bash или совместимой оболочке
  • Часть идентификатора всегда yyyy-nnnn- сопровождаемый одной или несколькими цифрами (в последовательности), сопровождаемый чем-то еще

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

Запустите это в каталоге, где файлы 1996-0011-1 BEG Foo Bar Foo Bar.jpg, 1996-0011-2 BEG Foo Bar Foo Bar.jpg, 2001-0006-1 MEF FooBar.jpg а также 2001-0006-2 MEF FooBar.jpg уже существует.

$ ls -1
1996-0011-1 BEG Foo Bar Foo Bar.jpg
1996-0011-2 BEG Foo Bar Foo Bar.jpg
2001-0006-1 MEF FooBar.jpg
2001-0006-2 MEF FooBar.jpg
$ mkdir old
$ for filename in *.jpg; do
>   test -f "$filename" && convert +append ${filename:0:10}* "${filename:0:9} ${filename:12}" && mv ${filename:0:10}* old/; done
$ ls -1
1996-0011 BEG Foo Bar Foo Bar.jpg
2001-0006 MEF FooBar.jpg
old/
$ rm -r old
$

Как это работает, для каждого файла.jpg в каталоге:

  1. проверить, существует ли файл и является ли он обычным файлом
  2. если файл существует, то запустите convert, передавая первые десять символов имени файла (начиная с позиции символа 0, извлекая 10 символов) в расширение подстановочного знака оболочки, которое будет предоставлено в качестве параметров для преобразования, за которыми следуют первые девять символов имени файла, за которым следует пробел, за которым следует все начиная с 12-го символа (вы можете отрегулировать эту часть, чтобы получить желаемый тип имени выходного файла; обязательно сделайте соответствующую настройку для mv призывание)
  3. если convert запустился и прошел успешно, переместите все входные файлы в отдельный каталог, чтобы убрать их с дороги

В конце у вас будут выходные файлы в текущем каталоге, и все входные файлы будут перемещены в каталог с именем old, Обязательно сначала протестируйте приведенный фрагмент на некритических данных.

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