# Упрощение написания скриптов для GIMP
vit01(mira, 1) — All
2016-03-28 20:15:22


Возникла на днях задача пакетно обработать 179 JPEG-файлов.

Была мысль сначала взять ImageMagick, но подумал, что мало приятного в его использовании. PIL (Python Imaging Library) использовать тоже не хотелось, потому что многие параметры там надо подкручивать вручную.

И тут вспомнил, что в Гимпе есть свой встроенный Лисп. Воображение сразу разгулялось =)
Открыл встроенную консоль для Script-Fu и нашёл пару статеек на Хабре (например, эта: https://habrahabr.ru/post/111387/ )

Но не тут-то было! Изначально хотелось писать скрипты в своём любимом Vim'e и удобно их отлаживать, но Гимп предлагает только примитивный REPL (который требует запись программы в одну строку) и каталог модулей, запуск которых идёт как будто в "чёрном ящике".

Обнаружил, что можно запустить сервер Script-Fu и подключаться к Гимпу удалённо. Протокол у него предельно простой, но вот нормальных готовых клиентов реализовано практически не было.

Один из них полностью на Perl (и перлом заправляет, т.е. никаких скобочек), другой на неизвестном диалекте Scheme, третий на Питоне (из исходников самого Гимпа) и ничего мне нужного не умеет.

Решил реализовать собственный, на Си, через сокеты. Для скачивания идти сюда: https://github.com/vit1-irk/gimp-exec

Всё, что он делает - это скармливает Scheme-овский исходник запущенному GIMP-серверу, который уже выполняет всю работу. Может быть, кому-нибудь пригодится.

* Запускаете GIMP-сервер (удобнее через меню "Фильтры" => "Script-Fu" => "Запустить сервер")
* Пишете скрипт в вашем любимом редакторе
* Скармливаете его командой gimp-exec your-script.scheme
* Всё

Дополнительные моменты в README.md репозитория.

А для конвертации получилось вот такое вот заклинание:

(gimp-message-set-handler 1)
(let*
	((files (cadr (file-glob "/путь/к/картинкам/*" 1))))
	(while (not (null? files))
		(let (
			(filename (car files))
			(new-filename "")
			(image 0)
			(layer 0)
		)
			(set! image (car (gimp-file-load RUN-NONINTERACTIVE filename filename))) 
			(set! layer (car (gimp-image-get-active-layer image)))
			(set! new-filename (string-append filename "-new.png"))

			(gimp-message (string-append "Обрабатываем " filename))

			(gimp-levels-stretch layer)
			(gimp-brightness-contrast layer 0 40)
			(gimp-posterize layer 10)
			(gimp-image-convert-grayscale image)
			(gimp-image-convert-indexed image 2 3 10 FALSE TRUE "colors")
			(file-png-save RUN-NONINTERACTIVE image layer new-filename new-filename 0 9 0 0 0 1 0)
			(gimp-image-delete image)
		)
		(set! files (cdr files))
	)
)

За отступы и оформление кода в целом не ругайте, по-другому читать ЭТО не получается =)

# Re: Упрощение написания скриптов для GIMP
Andrew Lobanov(station13, 1) — vit01
2016-03-29 18:25:59


vit01> За отступы и оформление кода в целом не ругайте, по-другому читать ЭТО не получается =)

Возможно одно из двух: или ты не привык к лиспу или твой редактор некорректно занимается автоформатированием. Но в любом случае, код вполне читаемый на выходе, но видно, что писал человек, привыкший к алголоподобному синтаксису =)

// Не знал, что в гимпе есть лисп. Спасибо за информацию.

# Re: Упрощение написания скриптов для GIMP
vit01(mira, 1) — Andrew Lobanov
2016-03-30 06:46:55


AL> Возможно одно из двух: или ты не привык к лиспу

Оно самое.

AL> видно, что писал человек, привыкший к алголоподобному синтаксису =)

Когда знакомился с эстетическими правилами оформления в CL, они мне как-то не понравились. Иногда читаю конкретно твой лиспокод и всё никак не могу с этим смириться.

Просто хочется как-то отделять скобочные блоки, чтобы не запутаться в них. Если оставлять закрывающие скобки на предыдущей строке (а не на отдельной), то очень трудно определить, где какой смысловой блок, и очень просто сделать синтаксическую ошибку.

AL> Не знал, что в гимпе есть лисп.

В нём ещё и интеграция с питоном есть (правда питон не встроенный), но для лиспа там есть сервер, а для питона - нет.
Даже забавно с другой стороны.

- Через Emacs можно советоваться с психотерапевтом и играть в тетрис!
- Подумаешь тетрис! Я вон GIMP вместо калькулятора использую :D

# Re: Упрощение написания скриптов для GIMP
Andrew Lobanov(station13, 1) — vit01
2016-03-30 07:19:11


> Просто хочется как-то отделять скобочные блоки, чтобы не запутаться в них. Если оставлять закрывающие скобки на предыдущей строке (а не на отдельной), то очень трудно определить, где какой смысловой блок, и очень просто сделать синтаксическую ошибку.

Тут какое дело. Лиспокод не по скобочкам читают на самом деле. Я скобочки не замечаю даже особо. Блоки отделяются отступом, а синтаксис на скобочки не так уж и завязан при чтении человеком, как бы это странно не звучало.

> - Через Emacs можно советоваться с психотерапевтом и играть в тетрис!
> - Подумаешь тетрис! Я вон GIMP вместо калькулятора использую :D

Было бы прикольно подключиться SLIME к гимпу.

# Re: Упрощение написания скриптов для GIMP
vit01(mira, 1) — Andrew Lobanov
2016-03-30 07:49:30


AL> Тут какое дело. Лиспокод не по скобочкам читают на самом деле. Я скобочки не замечаю даже особо. Блоки отделяются отступом, а синтаксис на скобочки не так уж и завязан при чтении человеком, как бы это странно не звучало.

Дело скорее не именно в чтении (мы же всё-таки буквы читаем, а не скобочки, верно?), а в написании кода. Когда он уже написан, скобки можно перенести на предыдущие строки и не обращать на них внимания. Но во время кодинга привык отделять. Ладно, спишу это на свои привычки.

AL> Было бы прикольно подключиться SLIME к гимпу.

Не поверишь, но такой плагин уже существует: https://github.com/pft/gimpmode