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).
-----------------------

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

    Error

    default userpic

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 7 comments