Подняли интересную тему, давно собирался с этим поковыряться, однако моим типовым запросам обычно хватало imagemagic, поэтому до данного топика ничто особо не подстегивало эту тему форсировать. Ну да ладно. Поковырялся я со Script-fu, результатом ковыряния стал
быдлокод скрипт, который я и предлагаю Вашему вниманию в качестве решения поднятой Вами проблемы, а именно - автоматическое восстановление конкретной области фильтром "Фильры" -> "Улучшение" -> "Восстановить выделение" (он же python-fu-heal-transparency). Для всех: прежде чем сувать этот скрипт к себе, удостоверьтесь что такой фильтр вообще доступен у Вас в редакторе. Если не доступен, то предварительно следует его установить; например, для этого достаточно установить пакет:
sudo apt install gimp-plugin-registry
Исходник, на основе которого я писал предлагаемый скрипт, находится
здесь. Его детально разбирали на
хабре. Так что нам остается выполнить нижеописанное (опыт выполняю в Ubuntu Budgie 18.04, установлен Gimp 2.8.22 через apt [не snap-пакет и не еще какая-нибудь новомодная штука - там надо отдельно смотреть откуда он свои скрипты подтягивает]).
Как установить:1. Создаем новый текстовый документ в правильном месте и с правильным именем. Это будет наш скрипт:
gedit $HOME/.gimp-2.8/scripts/resintizer_many_files.scm
Исполняемым его делать не нужно - гимп и так его прекрасно видит.
2. В открывшемся окне текстового редактора вводим нижеприведенный код:
;сам скрипт:
(define (script-fu-resintizer-many-files inputFolder outputFolder x y width height samplingRadiusParam directionParam orderParam)
(let* ((filelist (cadr (file-glob (string-append inputFolder DIR-SEPARATOR "*") 1))))
; обходим все файлы в исходной папке
(while (not (null? filelist))
(let* ((filename (car filelist))
(image (car (gimp-file-load RUN-NONINTERACTIVE filename filename)))
(drawable (car (gimp-image-get-active-layer image)))
(active-selection 0) )
(gimp-rect-select image x y width height CHANNEL-OP-REPLACE FALSE 0) ;создаем на изображении прямоугольное выделение
;запускаем восстановление выделения
(python-fu-heal-selection RUN-NONINTERACTIVE image drawable samplingRadiusParam directionParam orderParam)
;задаем имя выходному файлу
(set! filename (string-append outputFolder DIR-SEPARATOR (car (gimp-image-get-name image))))
;сохраняем результат в выходную папку
(gimp-file-save RUN-NONINTERACTIVE image drawable filename filename)
(gimp-image-delete image) ;закрываем изображение в редакторе
)
(set! filelist (cdr filelist)) ) ) )
;описание формы с параметрами скрипта:
(script-fu-register
;Имя скрипта, как его идентифицирует GIMP (должно совпадать с именем процедуры, которую вызывает скрипт)
"script-fu-resintizer-many-files"
;имя скрипта, как он будет отображаться в меню
"Восстановить область в изображениях (пакетно)"
;описание скрипта
"Выберите каталог для обработки, задайте параметры области, которую следует восстановить, и параметры восстановления этой области - каталог будет обработан автоматически"
;автор скрипта
"zg_nico"
;копирайт
"-=MADE-BY-NICO=-"
;дата выпуска
"03/05/18"
;типы поддерживаемых цветовых моделей, не вводим ничего, - так скрипт будет доступен даже когда в GIMP не открыты изображения
""
;элементы управления, которые размещаются на форме (передаются нашему скрипту в порядке их объявления, имена перменным присвоены в самом заголовке главной процедуры скрипта, - так описываю, ибо для меня, к примеру, это дико):
SF-DIRNAME "Каталог с изображениями, которые надо изменить" "" ;inputFolder - входной каталог
SF-DIRNAME "Каталог для сохранения изображений" "" ;outputFolder - выходной каталог
SF-VALUE "Выделение: X верхнего левого угла выделения" "100" ;x - координата левого верхнего угла выделения
SF-VALUE "Выделение: Y верхнего левого угла выделения" "100" ;y - координата левого верхнего угла выделения
SF-VALUE "Выделение: ширина выделения" "400" ;width - ширина области выделения
SF-VALUE "Выделение: высота выделения" "400" ;height - высота области выделения
;параметры нашего "умного восстановителя", которые будем применять к каждой картинке
SF-VALUE "Радиус заимствования (в пикселях)" "50" ;samplingRadiusParam - радиус заимствования в пикселях
SF-OPTION "Источник данных" '("Всё вокруг" "Слева и справа" "Выше и ниже") ;directionParam - истояник данных
SF-OPTION "Направление отрисовки" '("Случайно" "Наружу от центра" "Внутрь к центру") ;orderParam - направление отрисовки
)
;регистрация скрипта в интерфейсе GIMP:
(script-fu-menu-register
"script-fu-resintizer-many-files"
"<Image>/Filters/Мои скрипты"
)
Сохраняем изменения. Закрываем текстовый редактор.
3. Запускаем GIMP любым удобным для Вас способом (если был открыт - перезапустите, либо просто выполните команду меню "Фильтры" -> "Script-Fu" -> "Обновить сценарии"). В GIMP ищем меню "Фильтры" -> "Мои скрипты" -> "Восстановить область в изображениях (пакетно)".
Как пользовать:Имею: папку по пути
/home/ЮЗВЕРЬ/Тестовая, набитую до одури изображениями одного размера, на каждом из которых надо исправить заранее понятную область (прямоугольная, левая верхняя точка в позиции X=485, Y=295; размеры прямоугольника 330х330 - как раз перекроем центральное изображение в моем примере...)
Хочу: внести это исправление и сохранить все изображения в папку
/home/ЮЗВЕРЬ/Выход.
Мои действия: открываю GIMP (не важно - открыты в нем какие-то изображения сейчас или нет), иду в меню "Фильтры" -> "Мои скрипты" -> "Восстановить область в изображениях (пакетно)". В появившемся окне заполняю должным образом поля:

4. Нажимаю на "Ок", жду некоторое время (зависит от того, насколько много изображений и насколько мощная у нас машина).
5. ...
6. Profit!
Из минусов: 1. Необходимость ввода параметров выделения РУКАМИ, что не кошерно и немного бесит. Как обойти - пока не понял. Есть мысль заставить пользователя открыть изображение, выбрать в нем область, и только потом вызывать это окошко, в котором уже указывать входную и выходную папки...
2. Нет проверок на ошибки. Если ввести область выделения больше чем само изображение - я слабо себе представляю что будет. Можете "побагтестить", если интересно ))
3. Код наверное криво оформлен, т.к. ну не писал я никогда на Script-fu до сих пор.
По сути, по наитию и с гуглением обо всем подряд... Никуда без штатных средств гимпа. Например, просмотрщик "Просмотр процедур" вызывается в меню "Справка" -> "Просмотрщик процедур". Из него взяты (вместе с синтаксисом и описанием аргументов):
1. Внутренняя процедура "Открытие файла" (gimp-file-load run-mode filename raw-filename)
run-mode [INT32] - режим работы. 0 - интерактивный, 1 - не интерактивный
filename [STRING] - имя файла
raw-filename [STRING] - имя файла, как его вводит пользователь (вероятно, я коряво перевел это пояснение...)
2. Внутренняя процедура "Прямоугольное выделение" (gimp-rect-select image x y width height operation feather feather-radius)
image [IMAGE] изображение
x [FLOAT] координата по Х левого верхнего угла прямоугольника выделения
y [FLOAT] координата по Y левого верхнего угла прямоугольника выделения
width [FLOAT] (>= 0) (ширина прямоугольника выделения)
height [FLOAT] (>= 0) (высота прямоугольника выделения)
operatin [INT32] The selection operation { CHANNEL-OP-ADD (0), CHANNEL-OP-SUBTRACT (1), CHANNEL-OP-REPLACE (2), CHANNEL-OP-INTERSECT (3) } (операция объединения, применяемая к выделению, - нам НЕ требуется по логике вещей, но заработало с CHANNEL-OP-REPLACE, - с другими как-то уже не особо хочу тестить...)
feather [INT32] (TRUE or FALSE) (растушевка выделения - нам НЕ требуется)
feather-radius [FLOAT] (>=0) (радиус растушевки выделения - нам НЕ требуется)
3. Требуемый нам модуль "Восстановить выделение" (python-fu-heal-selection run-mode image drawable samplingRadiusParam directionParam orderParam)
run-mode [INT32] The run mode { RUN-INTERACTIVE (0), RUN-NONINTERACTIVE (1) } (режим запуска - будем юзать 1, что значит не интерактивный)
image [IMAGE] входное изображение
drawable [DRAWABLE] область рисования
samplingRadiusParam [INT32] Ширина области заимствования (px)
directionParam [INT32] направление рисования
orderParam [INT32] Порядок заполнения
4. Внутренняя процедура "Сохранение файла"
(gimp-file-save run-mode image drawable filename raw-filename)
run-mode [INT32] - режим работы. 0 - интерактивный, 1 - не интерактивный
image [IMAGE] Input image - входное изображение
drawable [DRAWABLE] input drawable - область рисования
filename - имя файла
raw-filename - имя файла, как его вводит пользователь
Синтаксис каждой команды выяснялся через консоль (если нажать кнопку "Посмотреть" и после два раза кликнуть на любую функцию - она будет вставлена в консоль с подставленными переменными). Чтобы отобразить консоль, идем в меню "Фильтры" -> "Script-Fu" -> "Консоль".