разделить изображения jpg по заданным пропорциям (imagemagick)

разделить изображения 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. после разделения или во время разделения возможно ли автоматически пронумеровать их в желаемом порядке, описанном выше?

решение1

Как разделить изображения на основе этих разделительных линий с помощью [ImageMagick?]

Вероятно, самым простым решением было бы использовать-обрезатьвот так:

convert -crop 3x2@ -scene 1 image1.jpg image2.jpg cropped_%02d.jpg

Эта команда:

  • Делит каждое изображение на 6 (примерно) одинаковых по размеру фрагментов (-обрезка 3x2@), нумеруя каждый по порядку.

  • Начинает последовательность нумерации с 1(-Сцена 1), скорее, чем 0.

  • Добавляет к конечным числам 0-дополнение ( %02d) в виде отдельных цифр [ 01-09].

Заметки командования

  • Хотя для обрезки плитки можно указать точный размер (например, 1000x1000) или использовать проценты (например, 33%x50%), это также может привести к «обрезке» изображений (что, скорее всего, нежелательно).

  • Использование eg -3x2@обычно создает изображения, которые по размеру (относительно друг друга) ближе, чем «выходящие за пределы» проценты (eg 33.4%x50%), чтобы избежать создания «обрезных» изображений.

  • В пакетном файле вам придется удвоить знаки процента, чтобы они работали так, как задумано:

    convert -crop 3x2@ -scene 1 image1.jpg image2.jpg cropped_%%02d.jpg
    
  • Если вы пишете в форматах, которые могут иметь смещения изображения/холста (например .png, ), вы можете включить+перестраницапосле вашего -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перед одинарными цифрами (например,изображение_1.jpgпротив.изображение_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...обрезанный_XX.jpg) в порядке, указанном в вашем вопросе. Вам нужно будетиметь копию Pythonустановлен, если вы решите попробовать.

Ограничения

  • Не считывает информацию из текстовых файлов (поэтому на данный момент список файлов не указывается). Аналогично, в командной строке требуется указать префикс и расширение имени изображения/файла.

  • В текущем виде скрипт ожидает, что имена файлов будут возвращены в правильном порядке автоматически (см. Windows и 0-padding выше).

  • Существует возможность использовать сторонний модуль, называемый natsort(устанавливается с помощью eg python -m pip install natsort), если ваши элементы не 0-padded. Однако вам необходимо раскомментировать строку 13 ( from natsort import natsorted) и строку 105 ( item_list = list(natsorted(item_list))) в скрипте после установки, natsortчтобы использовать эту возможность.

Чтобы было понятно, "раскомментировать" означает удалить #и начальный пробел в начале строки. Дополнительные инструкции по использованию включены в скрипт.

Связанный контент