Разделить изображения jpg по заданным пропорциям (imagemagick)
У меня есть куча изображений, отсканированных в формате jpg. Как вы видите на рисунках ниже, карточки двусторонние, при сканировании я поместил 6 карточек внутрь сканера.
Лицевая сторона первой карты обозначена цифрой 1 на рисунке ниже, а ее задняя сторона обозначена цифрой 7. Лицевая сторона второй карточки обозначена цифрой 2, а ее задняя сторона обозначена цифрой 8 и т. Д.
Чего я хочу добиться: разделить эти файлы (image1.jpg и image2.jpg) таким образом, чтобы у меня была папка с отдельными карточками в следующем порядке:
1.jpg(1)
2.jpg(7) (since 7 is the back side of the 1.jpg)
3.jpg(2)
4.jpg(8)
etc
(image1.jpg) Лицевая сторона шести карт:
(image2.jpg) Обратная сторона шести карт:
1- Как я могу разделить изображения на основе этих разделительных линий, используя imagemagick (или любое другое решение)? (Я могу получить x и y этих строк, потому что все изображения имеют размер 2550x3507)
разделительные линии выделены красным:
- после разделения или во время разделения можно ли автоматически нумеровать их в соответствии с желаемым порядком, описанным выше?
1 ответ
Как я могу разделить изображения на основе этих разделительных линий, используя [ImageMagick?]
Возможно, самым простым решением было бы использовать -crop следующим образом:
convert -crop 3x2@ -scene 1 image1.jpg image2.jpg cropped_%02d.jpg
Эта команда:
Делит каждое изображение на 6 (примерно) плиток одинакового размера ( -crop 3x2 @), пронумеровывая их по порядку.
Начинает последовательность нумерации с
1
( сцена 1), а не0
,Дает окончательные номера
0
-обивка (%02d
) в однозначных числах [01-09
].
Команды Примечания
Хотя можно указать точный размер (например,
1000x1000
) или используйте проценты (например,33%x50%
) для обрезки плитки это может потенциально привести к "обрезке" изображений (что, вероятно, нежелательно).Используя, например,
-3x2@
обычно создает изображения, которые ближе по размеру (по отношению друг к другу), чем проценты "перерегулирования" (например,33.4%x50%
) чтобы избежать "обрезки" изображений.В пакетном файле вам нужно удвоить знаки процента, чтобы они работали как задумано:
convert -crop 3x2@ -scene 1 image1.jpg image2.jpg cropped_%%02d.jpg
Если вы пишете в форматах, которые могут иметь смещения изображения / холста (например,
.png
), вы можете включить + repage после вашего-crop
:convert -crop 3x2@ +repage -scene 1 image1.jpg image2.jpg cropped_%02d.png
Если ваши входные форматы могут содержать смещения изображения / холста, вы можете
+repage
те, а также.
Переименование
Можно ли их автоматически нумеровать в соответствии с порядком, описанным выше?
С одним ImageMagick я не смог этого сделать (подозреваю, что это, скорее всего, невозможно, но я, честно говоря, не уверен в этом). Конечно, отдельно от ImageMagick, это вполне возможно.
Поскольку вы пометили этот вопрос batch
Стоит отметить, что я не могу помочь с какими-либо хорошими решениями в пакетном режиме. Имея это в виду, очень вероятно, что вы (или кто-то еще) могли бы придумать что-то лучшее, чем то, что я подробно опишу ниже.
Обязательный пакетный (не) ответ
Переименование методом перебора возможно с помощью пакета. Сначала временно переименуйте каждый файл (кроме первого и последнего), например:
rename cropped_02.jpg cropped_02_temp.jpg
[...]
rename cropped_11.jpg cropped_11_temp.jpg
Затем переименуйте их на новые позиции, например:
rename cropped_02_temp.jpg cropped_03.jpg
rename cropped_03_temp.jpg cropped_05.jpg
rename cropped_04_temp.jpg cropped_07.jpg
rename cropped_05_temp.jpg cropped_09.jpg
rename cropped_06_temp.jpg cropped_11.jpg
rename cropped_07_temp.jpg cropped_02.jpg
rename cropped_08_temp.jpg cropped_04.jpg
rename cropped_09_temp.jpg cropped_06.jpg
rename cropped_10_temp.jpg cropped_08.jpg
rename cropped_11_temp.jpg cropped_10.jpg
Пакет имеет возможность принимать аргументы из командной строки и делать математику, а также обладает for
петли и if
заявления и т. д., так что это решение (очевидно) может быть улучшено.
Переименование заметок
Если вы посмотрите на вторую половину процесса переименования выше, вы заметите шаблон в именах файлов. Фактически, для данной Позиции N мы можем использовать одну из следующих двух формул, чтобы найти новую позицию элемента в вашей схеме:
- Предметы до точки "на полпути" (например, 2-6):
(Position_N * 2) - 1
- Предметы, находящиеся за пределами "середины пути" (например, 7-11):
(Position_N * 2) - Total_Items
Примечание. Хотя эти формулы можно применять ко всей последовательности (например, 1 и 12), первый и последний элементы никогда не меняют позиций. Это, возможно, делает переименование их ненужным.
Кроме того, они должны работать для любого четного (не нечётного) количества позиций / позиций (4 или больше), при условии, что имена ваших файлов в порядке (например, от 1 до 12). Итак, для ваших оригинальных примеров:
Temp Item 2 becomes (2 * 2) - 1 = Item 3
Temp Item 7 becomes (7 * 2) - 12 = Item 2
Temp Item 8 becomes (8 * 2) - 12 = Item 4
[...]
Таким образом, приведенные формулы потенциально могут быть основой для пакетных (или других сценариев) решений. Тем не менее, есть несколько других вещей, о которых нужно знать, если вы решите использовать их как таковые...
Сортировка
Сортировка (как упоминалось выше) может иметь практические последствия в таких вещах, как сценарии, поскольку элементы, возвращаемые "не по порядку" Windows, будут "нарушать" приведенные формулы. В частности:
Windows сортирует имена в лексикографическом порядке по умолчанию. Это означает, что предметы, которые не имеют
0
перед одиночными цифрами (например, image_1.jpg и image_01.jpg) не будет отображаться в (естественном) порядке, если они возвращены непосредственно Windows. То есть они будут возвращены как, например:cropped_1.jpg, cropped_10.jpg, cropped_11.jpg, cropped_12.jpg, cropped_2.jpg, etc.
Определенные слова и фразы (такие как
- Copy
) в именах файлов также может влиять на порядок, в котором имена файлов возвращаются.
Если вы используете формулы выше, убедитесь, что 0
-аду одной цифры в именах файлов и удалять такие вещи, как - Copy
(или иным образом предпринять шаги для смягчения этих проблем).
Циклы / счетчики, начиная с 0
Если вы используете язык, который начинает считать с 0
(например, в циклах), тогда это может немного изменить формулы:
- Предметы до точки "на полпути" (например, 1-5):
(Position_N * 2)
- Предметы, находящиеся за пределами "половины пути" (например, 6-10):
(Position_N * 2) - (Total_Items - 1)
Помните, что, начиная с 0, будет запущено 12 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
,
Скрипт Python
Если вам интересно, я написал небольшой (вероятно, ужасный) скрипт на Python для Python 3.x (протестирован с 3.6.4), который можно использовать из командной строки для переименования произвольных файлов в последовательности (например, cropped_01. jpg... cropped_XX.jpg) в порядке, указанном в вашем вопросе. Вам нужно будет установить копию Python, если вы решите попробовать ее.
Ограничения
Не читает из текстовых файлов информацию (поэтому не указывать список файлов в настоящее время). Аналогично, префикс и расширение имени изображения / файла требуются в командной строке.
Таким образом, скрипт ожидает, что имена файлов будут возвращены в правильном порядке автоматически (см. Windows и
0
-обивка, выше).Есть возможность использовать сторонний модуль под названием
natsort
(устанавливается с помощью, например,python -m pip install natsort
) если ваши вещи не0
-padded. Тем не менее, вам нужно раскомментировать строку 13 (from natsort import natsorted
) и строка 105 (item_list = list(natsorted(item_list))
) в скрипте после установкиnatsort
использовать эту опцию.
Чтобы было ясно, "раскомментировать" означает удалить #
и ведущий пробел в начале строки. Дополнительные инструкции по использованию включены в скрипт.