Не получается открыть на разных слоях изображения из 2-х png

Главная Форумы Разработка Разработка сценариев Не получается открыть на разных слоях изображения из 2-х png

В этой теме 6 ответов, 4 участника, последнее обновление  UrikEEE 5 года/лет, 1 месяц назад.

Просмотр 7 сообщений - с 1 по 7 (из 7 всего)
  • Автор
    Сообщения
  • #912

    UrikEEE
    Участник

    Задача: имеются частично заполненные пары png-файлов с разрешением 256х256 точек каждый (с альфа-каналом, пример файлов см.во вложении), необходимо наложить их друг на друга и сохранить результат в отдельном png-файле.
    Пытаюсь налабать скрипт (а я тут новичок), и максимум, что получается — открыть один png-файл в одном слое.

    (define (open-png file-src-1 file-src-2 file-dst)
    (let*
    (
    ;*****************
    ; создать новое curr_image:
    ;(curr-image (car(gimp-image-new 256 256 RGB)))
    ;
    ; загрузить в слой curr-layer файл file-src-1:
    ;(curr-layer (car(gimp-file-load-layer 1 curr-image file-src-1)))
    ;
    ; добавить к изображению curr-image слой curr-layer
    ;(gimp-image-add-layer curr-image curr-layer 1)
    ;*****************

    ; открыть файл file-src-1 в curr-image:
    ;(curr-image (car(gimp-file-load 1 file-src-1 file-src-1)))
    (curr-image (car(file-png-load 1 file-src-1 file-src-1)))

    ; открыть файл file-src-2 в image-src2:
    (image-src2 (car(file-png-load 1 file-src-2 file-src-2)))

    ; получить рисуемую область из изображения image-src2 и :
    (draw-src2 (car(gimp-image-get-active-drawable image-src2)))
    (layer-src2 (car(gimp-layer-new-from-drawable draw-src2 curr-image)))
    (gimp-image-add-layer curr-image layer-src2)

    ; скопировать в буфер
    ;(gimp-edit-copy draw-src2)


    ;*****************
    ; загрузить в слой curr-layer файл file-src-2:
    ;(curr-layer (car(gimp-file-load-layer 0 curr-image file-src-2)))
    ;(gimp-image-add-layer curr-image curr-layer 2)
    ;
    ; объединить видимые слои и поместить их на слой merge-layer:
    ;(merge-layer (car(gimp-image-merge-visible-layers curr-image CLIP-TO-IMAGE)))
    ;
    ; определить drawable, ПОЛУЧИВ его на основе curr_image:
    ;(curr-draw (car(gimp-image-get-active-drawable curr-image)))
    ;
    ; записать полученное изображение в файл file-dst:
    ;(file-png-save 0 curr-image curr-draw file-dst file-dst FALSE 9 TRUE FALSE FALSE FALSE FALSE)
    ;*****************

    (curr-display (car(gimp-display-new curr-image)))
    (gimp-displays-flush)
    )
    )
    )

    (script-fu-register "open-png"
    "/Filters/Urik/Open-PNG"
    "Merge two png-files (First png-file & Second png-file) in one and save it to Dest.png-file"
    "Urik"
    "Urik"
    "2012"
    ""

    SF-FILENAME "First png-file" "C:/Maps/19660_1.png"
    SF-FILENAME "Second png-file" "C:/Maps/19660_2.png"
    SF-FILENAME "Dest.png-file" "C:/Maps/19660_12.png"
    )

    я пытаюсь и так, и этак (надеюсь, это видно из закомментированных строк), но новый слой никак не хочет открываться!

    Есть какие-нибудь соображения, почему 2-й png-файл в моем скрипте не открывается в отдельном слое?

    #1695

    UrikEEE
    Участник

    кажется, я накосячил с конструкцией let* в своем скрипте.
    вместо приведенной в описании конструкции:

    (let*
    (
    (переменная значение)

    (переменная значение)
    )
    (выражение)

    (выражение)
    )

    у меня же по сути весь скрипт размещался в области объявления переменных. Буду переделывать…

    #1696

    UrikEEE
    Участник

    вот переписал скрипт, теперь заработало!!! Скобки и еще раз скобки))


    (define (open-png file-src-1 file-src-2 file-dst)
    (let*
    (
    ; объявление переменных:
    (curr-image 0)
    (curr-layer 0)
    (image-src2 0)
    (draw-src2 0)
    (layer-src2 0)
    (curr-display 0)
    (curr-draw 0)
    )
    ; открыть файл file-src-1 в curr-image:
    (set! curr-image (car(file-png-load RUN-NONINTERACTIVE file-src-1 file-src-1)))

    ; загрузить в слой curr-layer файл file-src-2:
    (set! curr-layer (car(gimp-file-load-layer RUN-NONINTERACTIVE curr-image file-src-2)))
    (gimp-image-add-layer curr-image curr-layer 2)

    ; объединить видимые слои и поместить их на слой curr-layer:
    (set! curr-layer (car(gimp-image-merge-visible-layers curr-image CLIP-TO-IMAGE)))

    ; отобразить (на время отладки) полученный результат:
    (set! curr-display (car(gimp-display-new curr-image)))
    (gimp-displays-flush)

    ; записать в файл file-dst
    (set! curr-draw (car(gimp-image-get-active-drawable curr-image)))
    (file-png-save RUN-NONINTERACTIVE curr-image curr-draw file-dst file-dst FALSE 9 TRUE FALSE FALSE FALSE FALSE)
    )
    )

    (script-fu-register "open-png"
    "/Filters/Urik/Open-PNG"
    "Merge two png-files (First png-file & Second png-file) in one and save it to Dest.png-file"
    "Urik"
    "Urik"
    "2012"
    ""

    SF-FILENAME "First png-file" "C:/Maps/19660_1.png"
    SF-FILENAME "Second png-file" "C:/Maps/19660_2.png"
    SF-FILENAME "Dest.png-file" "C:/Maps/19660_12.png"
    )

    и последний на сегодня вопрос (надеюсь не самому себе))): можно ли заставить gimp (работает под Windows) выполнять этот скрипт в режиме командной строки?

    Мне желательно за один запуск обработать сразу энное количество пар png-файлов.
    Обработку одной пары файлов я представляю себе вот такой строкой:

    (open-png "путь-к-файлу-1" "путь-к-файлу-2" "путь-к-файлу-результату")

    могу также сгенерировать в одном текстовом файле столько таких строк, сколько мне надо. Есть ли возможность заставить gimp (под Windows) за один раз выполнить этот файл? Извините за идиотские вопросы, если что…

    #1697

    prokoudine
    Хранитель

    UrikEEE написал:
    вот переписал скрипт, теперь заработало!!! Скобки и еще раз скобки))

    Ах, если бы все проблемы так решались… :)

    UrikEEE написал:могу также сгенерировать в одном текстовом файле столько таких строк, сколько мне надо. Есть ли возможность заставить gimp (под Windows) за один раз выполнить этот файл? Извините за идиотские вопросы, если что…

    Ждём spoilt_exile и zend в треде :)

    #1698

    zend
    Участник

    Ждём spoilt_exile и zend в треде

    А я надеялся отвертеться :-)

    могу также сгенерировать в одном текстовом файле столько таких строк, сколько мне надо. Есть ли возможность заставить gimp (под Windows) за один раз выполнить этот файл? Извините за идиотские вопросы, если что…

    Прямо так из командной строки Windows наверно не получится. Но выход есть универсальный и вы его практически нашли.

    Вам необходимо с генерировать в одном текстовом файле столько таких строк, сколько вам надо и выполнить получившийся в итоге сценарий с помощью «Фильтры» > «Script-Fu» > «Консоль».

    Пример такой операции можете посмотреть в статье http://www.opennet.ru/docs/RUS/gimp_scriptfu/ (там почти в самом конце под заголовком «Командная строка против графического интерфейса»).

    #1699

    spoilt_exile
    Участник

    Неинтересно, zend уже все показал и рассказал. Тем более по командной строке я не спец. Однако, если у автора темы есть еще вопросы, то милости просим.
    2 prokoudine: что не хватает каста как на ЛОРе?

    #1701

    UrikEEE
    Участник

    Спасибо тем, кто откликнулся. Запустить gimp из командной строки (под Windows), указав при запуске требуемую команду на ScriptFu, вполне возможно. Моя строка запуска выглядит так:

    gimp-2.6.exe -i -d -f -s --batch=(load "bat-png.scm")

    Я эту строку запускаю из vbs-скрипта (скрипт на Visual Basic), предварительно этим же vbs-скриптом готовлю текстовый файл bat-png.scm, записывая в него то количество строк-команд на ScriptFu, сколько мне нужно.

    Можно gimp запускать и из bat-файла под Windows, только в этом случае надо добавлять в начале «start «.

    Есть подводные камни в деле запуска gimp с командной строки под Windows. Я долго пытался вот здесь load «bat-png.scm» заставить gimp выполнить сценарий «bat-png.scm», указывая вначале путь к этому сценарию (например: «C:/tiles/bat-png.scm»).

    Дохлый номер! Я пытался указать путь по всякому: слэши прямые и обратные, вместо одного пару слэшей. Не видит gimp при старте из командной строки этого сценария и всё! Видит, только если положить сценарий в одну из папок scripts (в профайле пользователя или в программном каталоге gimp).

    Причем, если затем этот скрипт «bat-png.scm» оставить, то при обычном входе в gimp (не из командной строки) этот скрипт также будет выполняться. Поэтому мой vbs-скрипт сначала создает файл-скрипт «bat-png.scm» в папке scripts, затем запускает gimp с параметрами командной строки, ожидает окончания выполнения gimp и затем удаляет файл-скрипт «bat-png.scm».

    Еще один подводный камень — в пути к png-файлам gimp не переваривает символы кириллицы и пробелы (может, это же относится и к именам файлов — я это уже не стал даже проверять).

    Вот как-то так.

Просмотр 7 сообщений - с 1 по 7 (из 7 всего)

Для ответа в этой теме необходимо авторизоваться.