danilmaster (danilmaster) wrote in ru_gimp,
danilmaster
danilmaster
ru_gimp

Скрипт автоматической обработки изображений

Один добрый, умный и хороший человек написал и поделился скриптом. Он есть в жж, но ник уже не помню. Автор он. Я поищу, если надо будет или чуть попозже. Сама статья.

Пакетная обработка изображений в GIMP

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

Допустим, у нас есть куча фотографий разных размеров, с разным соотношением сторон и сохранённых в разных форматах. В общем, тяжёлый случай. Нам нужно весь этот зоопарк выровнять по размерам, учитывая пропорции, и сохранить в JPEG с заданным качеством. Да, и пусть нам иногда захочется задавать размеры не в пикселях, а процентах. Ну и пусть уже тогда захочется файлы выбирать по маске, типа «C:\images\img_01*.jpg».

Садимся, и калякаем на Script-Fu (доступный по умолчанию в GIMP, язык) свой первый сценарий:

(define (batch-resize pattern size quality)
(let* ((filelist (cadr (file-glob pattern 1)))
(len (if (string? size) (string-length size) 0))
(rate (if (and (> len 0) (char=? #\% (string-ref size (- len 1)))) (/ (string->number (substring size 0 (- len 1))) 100) 0))
(size (if (> rate 0) 0 (if (> len 0) (string->number size) size)))
)
(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)))
(old-width (car (gimp-image-width image)))
(old-height (car (gimp-image-height image)))
(width (if (> rate 0) (* rate old-width) (if (> old-width old-height) size (* size (/ old-width old-height)))))
(height (if (> rate 0) (* rate old-height) (if (> old-width old-height) (* size (/ old-height old-width)) size)))
)
(gimp-image-scale image width height)
(file-jpeg-save RUN-NONINTERACTIVE image drawable filename filename quality 0 1 1 "" 2 1 0 0)
(gimp-image-delete image)
)
(set! filelist (cdr filelist))
)
)
)

Самый простой способ воспользоваться этой радостью — вставить (текстом, или из файла) в консоль Script-Fu, и нажать Enter. Теперь наша функция batch-resize доступна для использования. Пользуем так (в консоли): (batch-resize "C:\\images\\*.jpg" 640 1). Или так: (batch-resize "C:\\images\\i_am_clever_*.*" "25%" 0.75). Не забываем, что в строках нужно ескейпить слеши, поэтому в путях под Windows придётся слеши удваивать. Второй параметр — размер большей стороны, указанный числом (в пикселях) или строкой (если с процентом, то размер рассчитывается в процентах). Третий — качество сохраняемых JPEG картинок (от 0 до 1).
-----------------------

Суть-то в чем, что это работает только до закрытия гимпа. Дальше гимп уже не помнит его. Как можно сделать так, чтобы код этот не компилировать постоянно в гимпе? Чтобы он сохранялся и работал сразу при следующем запуске :)
  • Post a new comment

    Error

    default userpic

    Your IP address will be recorded 

  • 7 comments