Пакетная обработка изображений в 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).





    Дальше только для любознательных. :)

    В функции file-jpeg-save кроме качества сохраняемой картинки задаются ещё некоторые параметры, влияющие на то же самое качество и, соответственно, размер. Описание параметров этой функции в просмотровщике процедур понятное, только нигде не написано какие индексы присвоены значениям субвыборки (4-й с конца параметр) и методу DCT (последний параметр). Я сохранял изображения с разными значениями этих параметров из самой программы и с помощью функции, и по размерам файлов вычислил нужные индексы.

    Итак, для указания нужной субвыборки используются: 0 — 2×2–1×1–1×1 (по умолчанию, наихудшая передача цветов, наименьший файл), 1 — 2×1–1×1–1×1 (4:2:2, цвета передаются лучше), 2 — 1×1–1×1–1×1 (цвета не искажаются, файл больше других), 3 — 1×2–1×1–1×1 (по цветопередаче похож на 2×1–1×1–1×1, размер больше).

    Методы DCT: 0 — целочисленный, 1 — быстрый целочисленный, 2 — с плавающей точкой. Визуально и по скорости работы я разницы не заметил, размеры файлов тоже совсем чуть-чуть отличались. Теоретически, с плавающей точкой выполняется медленнее и вносит меньше искажений.

    В опубликованном выше сценарии используется целочисленный метод DCT (0) и тип субвыборки с наилучшей цветопередачей — 1×1–1×1–1×1 (2).

    Ссылки по теме:
    1. Хорошее, хоть и устаревшее описание Script-Fu на русском.
    2. Описание языка Scheme. Здесь можно подсмотреть функции, которых нет в просморовщике процедур. Но следует учитывать, что в Script-Fu доступны далеко не все функции Scheme.
    3. Описание Scheme и ещё ссылки на Википедии.
    4. Справочное руководство по GIMP 2.0 Api.
    5. Много разных сценариев, разбитых по категориям.
    6. Ещё сценарии.
    7. Наш сценарий с подсветкой синтаксиса и вложенности скобок.
    Share post

    Comments 71

      +1
      Спасибо, познавательно. Но наверное не стоить упоминать про "совсем лениво", потому что в таких вьюверах графики как XnView пакетная обработка графики делается на много проще, и если уж человеку действительно будет лень, он воспользуется именно ими. :)
        +1
        Э... Так это нужно его ещё установить, а перед установкой знать, что он может. :) Предпочитаю держать на компе как можно меньше разнообразного софта. Один векторный редактор, один растровый, один (штатный) просмотровщик и т.д. Так и в голове просторнее (больше места для творчества), и легче найти общий язык с клиентами, у которых на компе только стандартный виндовый просмотровщик.

        В общем, заметка не про то, в чём лучше делать пакетную обработку, а как её сделать именно в Гимпе.
          0
          Вам нравится консоль и Вы не хотите ставить лишнего? Тогда mogrify идет к Вам.
        +1
        Если использовать ImageMagick - лидера консольной пакетной обработки графических файлов, то программу можно сократить до 6 понятных строчек.
          +1
          Сила scriptfu не в простых операциях, вроде масштабирования, а в сложных.

          Понятность параметров ImageMagick не стоит преувеличивать. Конечно, читаемость намного выше, чем у лиспа, но документация не очень полная, и, порой, можно наткнуться на неожиданные эффекты, вроде картинки за пределами границ изображения после -crop.
            +1
            в большинстве случаев можно даже до одной строчки сократить, но вот насчет понятности - не всегда верно.

            Всё-таки в IM всё ещё есть немалая доля шаманства (из-за каши в документации и интерпретации параметров). Я плотно использую IM в немаленьком проекте уже три года и до сих пор не перестаю удивляться некоторым вещам. Или неожиданым сюрпризам после, казалось бы, минорных обновлений.
              +1
              На самом деле вопрос только в том, кто чему научился, и хорошо знает. Для массового ресайза я тоже использую ImageMagick, а для особо извращенных задач, типа скачать с goole maps карту Москвы, кусочками 256x256 и склеить из них 9 мегабайтный jpeg - php-cli с gd2.so
              +2
              Ну именно для данного примера быстрее и удобнее (раза в 2-3 короче) будет написать обычный скрипт на Питоне.
                0
                В Гимпе, не так давно замечал Python-Fu, правда изучить его так и не взялся…

                А в общем, эти сценарии нужны больше не для пакетной обработки изорбажений, а для выполнения многошаговых/сложных операций, являющихся тривиальными…
                Кстате, многие сложные фильтры из стандартного набора гимпа — просто script-fu сценарии, построенные на других, более простых фильтрах.
                  0
                  Как-то раз делал скрипт автоматизации убирания красных глаз (рецепт основан на создании слоя без красного канала с маской). Очень облегчило жизнь.
                  +1
                  Или на Ruby :)
                    0
                    В Гимпе под Винду Питон нужно самостоятельно устанавливать. И примеров на Script-Fu гораздо больше. В общем, для новичка проще Script-Fu. Если только этот новичёк не работает постоянно с Питоном. :)
                    +1
                    XnView тоже для пакетной обработки подходит.
                    там опций дофига.
                      0
                      Спасибо, постоянно сталкиваюсь с подобной проблемой.
                      P.S. Подскажите пожалуйста какой нибудь вьюер под линукс в котором есть пакетная обработка картинок.
                        0
                        Гимп со скриптами.
                        =)

                        А по делу, да многие... XnView,GwenView... К чему душа больше лежит.
                          +1
                          А вот, например, чудный плагин nautilus-image-converter. Из описания:
                          Adds a Resize Images... menu item to the context menu of all images. This opens a dialog where you set the desired image size and file name. A click on Resize finally resizes the image(s) using ImageMagick s convert tool.
                            0
                            Похоже именно то что нужно! Большое спасибо!
                          0
                          Кошмар, это же LISP.
                            0
                            Угу. TinyScheme.
                            –1
                            Юзаю IrfanView. Никаких проблем. Для Gimp'a писать скрипты... отличная идея "стартапа"?
                            "Вспоминаем про замечательные средства автоматизации в замечательном и бесплатном редакторе GIMP." - действительно, вспоминаем. Спасибо.
                              0
                              Погодите, а зачем LISP? Там же python-fu есть. На нём намного проще и привычнее.
                                0
                                Он не «из коробки», к сожалению. Да и проще и привычнее, это если вы на Питоне пишете. Я ни с тем ни с тем не работал, поэтому смотрел на доступность и наличие примеров.

                                Было бы здорово, если бы кто-то и про Python-Fu написал.
                                  0
                                  Python-Fu как раз из коробки. Более того, если Вы поспрашиваете разработчиков гимпа, они скажут, что было бы неплохо сделать Петон основным сценарным языком программы.
                                    0
                                    В GIMP 2.4 под винду Python-Fu надо отдельно устанавливать. Как обстоит дело с другими версиями и под другие оси понятия не имею. Я вовсе не против, чтоб Питон сделали основным.
                                  0
                                  Аааррр! Злой и страшный лисп придёт ночью и съест тебя откусит твои последние скобочки.
                                  +3
                                  Кто же так скобки в лиспе форматирует? Вот так надо:

                                  (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)))))
                                    0
                                    Спасибо. С лиспом только знакомлюсь, ставил как было самому удобнее.
                                    –3
                                    Да уж, простая такая пакетная обработка... Вспоминаем, что программы фотообработки создаются для фотографов, а не для программистов, и вспоминаем, как просто пакетная обработка реализована в ФШ и делаем выводы.
                                      +1
                                      Ну и какие же мы делаем выводы?

                                      Выводы могут быть только такими:
                                      1) топик неправильно назван — больше подходит "Введение в script-fu";
                                      2) пример неудачный, ведь возможности script-fu куда более мощные.
                                        +1
                                        Разница в стоимости тоже существенная
                                          0
                                          Разницы в стоимости между GIMP и Xnview нет, однако последний просто чудесно справляется с пакетной обработкой - никаких скриптов, все удобно задается через графический интерфейс.

                                          При всем моем уважении к GIMP - это мой основной графический редактор - он все-таки не для этого сделан.
                                            0
                                            Я имел ввиду разницу в цене между ФШ(думаю в данном контексте это Photoshop) и Gimp.
                                              0
                                              Я понял, я хотел сказать что цена программы никак не соотносится с ее функциональностью.
                                        0
                                        Полезная тулза, но для юзеров проще выложить на ту же пикасу и не заморачиваться. Сам так делаю, хоть и програмер.
                                          0
                                          Вот поэтому дизайнеры предпочитают другие программы и ОС.
                                            +1
                                            Нет. Не по этому. Их просто учат во всех без исключения школах/вузах Photoshop'у. Когда я показал, что могу делать в GIMP на python-fu, одной знакомой дизайнеру она меня заставила этот GIMP сначала поставить ей на Windows, потом она сообщила, что в Windows он выглядит некрасиво, и заставила ставить ей Linux. Я честно её отговаривал :) не получилось на свою голову. Сейчас ещё python'у учить :)

                                            Может быть, GIMP сложнее освоить, чем Photoshop. Но он действительно очень мощный. Особенно, когда дело доходит до обработки мелких деталей, вы на мышке убьётесь это делать. А на python-fu, обычно, пара строчек кода :) В итоге, девушка берёт за работу, как Photoshop-дизайнер, но за компьютером сидит гораздо меньше. Правда, я сижу чуть больше :)...
                                              +2
                                              _Профессиональных_ дизайнеров нет смысла учить Гимпу: у него не хватает пока функционала. Для домашнего использования иногда вполне ничего.
                                                0
                                                Ну. Я не разбираюсь же... Меня просто попросили научить, значит, функционала хватило :) А чего именно не хватает? Лично у меня такое ощущение, что в библиотеке плагинов и скриптов для GIMP есть всё, что можно только пожелать. Хотя, опять же, я вообще не дизайнер, может, чего и не понимаю.
                                                  0
                                                  Для начала не хватает 16 bit, Lab color. Остальные недостатки легко находятся через Гугл.
                                                    0
                                                    В Gimp есть много функционала которого нет в Photoshop.
                                                    Это утверждение верно. И оно останется верным если переставить Gimp и Photoshop местами. В Гимпе нет поддержки CMYK, в Фотошопе нет скриптового языка.
                                                      0
                                                      >>Фотошопе нет скриптового языка
                                                      В Фотошопе есть скриптовый движок. Поройтесь в директории Scripting Guide.
                                                        0
                                                        Если-бы он у меня был, я-бы не допустил эту ошибку. Фактически я основываюсь на том что наши дизайнеры им не пользуются, сделал вывод что его нет. Mea culpa :(
                                                      0
                                                      Самое смешное, что статистическое большинство в ответ на вопрос, зачем они используют лаб, начинает руками изображать зигзаги каналов a* и b*. И невдомёк им, грешным, что для этого совсем не нужен фотошоп или гимп с лабом. Для этого всего лишь нужен нормальный конвертер RAW.
                                                        0
                                                        Ерунду какую-то вы написали. Если бы всё только занакчивалось увеличением насыщенности, которую вы описали... Вот расскажите как в вашем гипотетическом конверторе увеличить ч/б контраст, не трогая цветового?
                                                          0
                                                          Кроме смеха, именно повышением насыщенности для очень многих дело и кончается. Конвертер - не гипотетический, а совершенно реальный. Более того, упомянутый в топеге :)
                                                            0
                                                            Мы же вроде говорили о профессиональном использовании?

                                                            Если кому-то хватает только повышения контраста, пусть откроет для себя новый пункт "Vibrance" в ФШ конверторе: он как раз отвечает за что-то подобное.

                                                            А вообще Lab вещь мощная, умные дядьки вроде Моргулиса даже книжки целые пишут об этом, которые тут же становятся бестселлерами и классикой. А вы про насыщенность...
                                                              0
                                                              Профессионалами сейчас называет немного не тех и немного не за то.
                                                                0
                                                                Я под профессионалами понимаю людей, которые зарабатывают этим на жизнь и делают свою работу качественно. А вы?
                                                                  0
                                                                  Аналогично. Но при этом знаю очень немногих, реально парящихся лабом. Большинство осваивает фокус-два-три и затыкается на этом.
                                                    +1
                                                    Зато _талантливым_ дизайнерам пофиг в чем работать. Фотошоп, гимп и прочее всего-лищь многофункциональные инструменты. Проверено на дизайнерах.
                                                      0
                                                      _Талантливый_ дизайнер может и на бумаге рисовать, а потом сканировать. Только вот зачем? ФШ стоит не на столько много, чтобы отказываться от него при профессиональном использовании. Он дорог только для домашних пользователей: отсутствие гибкой политики лицензирования у Адоб - имхо единственный значительный минус ФШ.
                                                        0
                                                        Вот довод тот-же, вывод противоположный :)
                                                        Одно дело, когда изображение готовится для типографии, тогда ФШ. Но в случае вэб-дизайна Gimp превосходит Ps по возможностям, особенно во времена "Веб 2.0" (я не понимаю как этот термин некоторые проецируют на графику, но для обозначения стиля сойдет). Другое дело что интерфейс объективно не удобен и большинство кадров обучено фотошопу - на переучивании теряется больше денег чем стоит фотошоп.
                                                          0
                                                          Поправочка: субъективно неудобен :)
                                                    0
                                                    Теории заговора, конечно, интересны, ну уж больно сильно энтропийны, поэтому должны использоваться только в крайних случаях.
                                                    Я не спорю, что скриптами писать - эффективно, но просто это другая работа, не дизайнерская. На ваш пример есть куча других контрпримеров, например: "я эту конфетку ни на что не променяю", говорит мне знакомый, так скажем - художник.
                                                      0
                                                      Ну. На что можно ответить так: 1. А он пробовал что-нибудь другое, кроме win/mac? 2. Дизайнеры разные бывют и разными работами занимаются. Вот конкретно этой девушке понравился GIMP и скрипты. Ни на что большее я не претендую :) Просто привёл пример того, что дизайнеры, иногда и под GNOME переезжают, потому что им там эффективнее живётся.
                                                      –1
                                                      хм, объедините мне точно панораму в 6400px по ширине из 5 разных фотогрфий и отрисуйте дополнительно объекты, замените в каждой пятой часте панорамы облака, погоду, и время суток. И все с помощью пары строчек кода. В реальности дизайнерам никогда не нужно что-то писать руками.

                                                      p.s. В фотошопе намного приятнее и быстрее работать под MacOS X
                                                        0
                                                        Фотошоп, как и любой другой редактор такого рода для сборки панорам субоптимален. Так что пример не в тему :)
                                                          0
                                                          Ну. Облака я менял - ничего сложного. С остальным не сталкивался... Ну будет не пара строчек. Будет пара десятков. Это всё-равно быстрее, imho, чем мышкой напряжённо кликать. Плюс сценарии сохраняются на будущее.
                                                            –1
                                                            спасибо, поржал =)
                                                              0
                                                              Над чем именно? :) Над тем, что выделить множество пикселей по цвету, выдрать их из картинки, заменить другими из сгенерированного фрактала, размазать окрестности - это всего восемь строчек кода? Мышкой бы я точно два дня возился бы :) Ну, да. Смейтесь над человеком, который мышку не умеет :)
                                                          0
                                                          Когда я показал, что могу делать в GIMP на python-fu, одной знакомой дизайнеру она меня заставила этот GIMP сначала поставить ей на Windows, потом она сообщила, что в Windows он выглядит некрасиво, и заставила ставить ей Linux. Я честно её отговаривал :) не получилось на свою голову. Сейчас ещё python'у учить :)

                                                          кажется мне, не в Гипме и Линуксе дело тут, просто она хочет чтобы ты уделил ей внимание
                                                            0
                                                            >Может быть, GIMP сложнее освоить, чем Photoshop. Но он действительно очень мощный.

                                                            По-честному всё это называется так: для осознания мощности GIMP'а надо выучить язык программирования. Отличный путь для дизайнера. Я бы посмотрел на рабочего, которому дадут мешок деталей вместо перфоратора со словами:"это очень мощный инструмент, надо только поискать в библиотеках чертежей как собирать нужное устройство."
                                                            В вашем примере у девушки, работающей в GIMP'е, есть выделенный программист для скриптов. С таким подходом, винда+фотошоп как минимум дешевле.
                                                          0
                                                          ((((Lisp это) конечно) хорошо), ((но bash), python и imagemagic привычнее))
                                                            +1
                                                            Спасибо, в мемориз.

                                                            А по теме могу добавить, что дело не в том удобно или нет, а в том, что Линуксоиды сидят на Гимпе чаще всего, и для них это отличное решение, ну это мое личное имхо.
                                                              0
                                                              По-моему в фотошопе с помощью Action все-таки намного удобнее, нагляднее, и писать ничего не нужно.
                                                                0
                                                                В фотошопе есть собственный движок обработки скриптов. Ну и выбор языков, на которых написаны эти скрипты приличный - Java Script, Action Script, VBS. А в связке с Batch так вообще сказка.
                                                                  0
                                                                  Не Action, а Apple.
                                                                  0
                                                                  Только если тупо повторить действия. А вот когда дело до интерактивщинки доходит... :)
                                                                  0
                                                                  Было бы интересно увидеть сравнение производительности.
                                                                  Одни и те же пакетные операции на GIMP и IM.
                                                                  В идеале для случая параллельной работы над многими файлами. (Размечтался.)
                                                                    0
                                                                    рекомендую NСonvert, в вопросе пакетных преобразований - монстр, + знает огромное количество форматов. Минус у него один, не умеет рисовать. Хотя для ресайза фоток в галерею это не надо.
                                                                      0
                                                                      Script-Fu отличная возможность, но если надо пакетом выполнить обработку NNN изображений — также можно использовать пакетный плагин для GIMP — BIMP (Batch Image Manipulation), скачать BIMP можно с сайта GIMP

                                                                      Only users with full accounts can post comments. Log in, please.