Программирование: не работает скрипт (script-fu)

Главная Форумы Разработка Разработка сценариев Программирование: не работает скрипт (script-fu)

В этой теме 6 ответов, 2 участника, последнее обновление  alenari 5 года/лет, 9 мес. назад.

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

    alenari
    Участник

    Очень нужна помощь. Никогда не изучала языки программирования, да и склад ума, видимо, не технический. Сложно въехать… Сегодня накатала такой «скриптик», но он не доделан и не работает.
    Никак не могу доделать его, мозгов не хватает.
    Смысл скрипта создать поля:
    — выцепить ширину и высоту открытой картинки
    — определить меньшую сторону, значение меньшей стороны разделить на 25, округлить и умножить на 2
    — полученное значение приплюсовать к старым ширине и высоте и создать слой с новыми значениями
    — отцентровать слой с картинкой

    1. Не могу понять, как из открытой картинки выцепить параметры высоты и ширины.
    2. Что нужно вписать вместо «?» в первых двух строках?
    3. Почему не получается вписать SF-Image и SF-Drawable в script-fu-registr (gimp начинает ругаться)?
    4. Как потом отцентровать картинку?

    (define (script-fu-border ?)
    (let* ((img (car (gimp-drawable-get-image ?)))
    (owidth (car (gimp-image-width img)))
    (oheight (car (gimp-image-height img)))
    (border (car (if (< oheight owidth) (* 2 (round (/ oheight 25))) (* 2 (round (/ owidth 25))) )))
    (width (+ owidth border))
    (height (+ height border))
    (layer (car (gimp-layer-new img width height 0 “Border-Layer” 100 BEHIND-MODE))) )
    (gimp-image-undo-group-start img)
    (gimp-image-add-layer img layer 0)
    (gimp-image-undo-group-end img) ))
    (script-fu-register
    “script-fu-border”
    “script-fu-border”
    “”
    “”
    “”
    “”
    “”
    “RGB”)
    (script-fu-menu-register
    “script-fu-border”
    “/Filters/My scripts”)

    #1559

    alenari
    Участник

    Попробовала переписать скрипт.
    Теперь выдает такую ошибку «Error: Invalid type for argument 2 to gimp-file-load «.
    В чем смысл ошибки?

    (define (script-fu-new filename)
    (let*
    (
    (img (car (gimp-file-load 1 filename filename)))

    (drawable (car (gimp-image-get-active-layer img)))

    (owidth
    (car (gimp-image-width img)))

    (oheight
    (car (gimp-image-height img)))

    (border
    (car
    (if
    (< oheight owidth) (* 2 (round (/ oheight 25))) (* 2 (round (/ owidth 25)))
    )))
    (width
    (car (+ owidth border)))

    (height
    (car (+ oheight border)))

    (layer
    (car
    (gimp-layer-new img width height 0 «Border-Layer» 100 BEHIND-MODE)))

    )

    (gimp-image-undo-group-start img)

    (gimp-image-add-layer img layer 0)

    (gimp-image-undo-group-end img)

    ))

    (script-fu-register
    «script-fu-new»
    «Border»
    «Create border»
    «Dasha»
    «Dasha»
    «30.09.2011»
    «RGB»
    SF-IMAGE «» 0
    SF-DRAWABLE «» 0
    SF-FILENAME «File» «»)
    (script-fu-menu-register «script-fu-new» «/Filters/My scripts»)

    #1560

    spoilt_exile
    Участник

    Доброе утро.
    Оба скрипта вообще неработоспособны. Просто немного не соблюдена процедура регистрации скрипта. Проще говоря, скрипт — это функция, когда вы ее объявляете, то сразу указываете какие аргументы должны передаваться этой функции для работы. При вызове функции GIMP должен передать все аргументы этой функции, если их количество не совпадает, то все дело вылетает с ошибкой. В первом коде у вас в функции всего один аргумент «?», однако в регистрации скрипта он почему-то не указан (все плюшки SF-* это указатели для аргументов).

    1. Не могу понять, как из открытой картинки выцепить параметры высоты и ширины.

    Вы уже это реализовали в коде:


    (owidth (car (gimp-image-width img)))
    (oheight (car (gimp-image-height img)))

    2. Что нужно вписать вместо «?» в первых двух строках?

    Нужно передать изображение и слой в скрипт. Сделать это можно легко:


    (define (script-function image layer)
    ;Содержание функции
    )

    ;Поместить в код регистрации скрипта
    SF-IMAGE "" 0
    SF-DRAWABLE "" 0

    4. Как потом отцентровать картинку?

    А вот это вопрос, Можно с помощью gimp-layer-set-offsets сдвинуть слой, одноко высчитать значение еще необходимо.
    В любом случае это все достаточно сложно для новичка, попробую вам помочь, ждите скрипт к обеду.

    #1561

    spoilt_exile
    Участник

    Уже все готово, задача простой оказалась. В посте прикреплен рабочий скрипт с коментированным кодом.

    #1564

    alenari
    Участник

    Спасибо большое за помощь)
    Изучаю ваш вариант)
    Есть еще такой вариант, он работает)

    P.S. спасибо за комментарии и что потратили свое время, очень вам благодарна

    #1565

    spoilt_exile
    Участник

    Есть еще такой вариант, он работает)

    Я не уверен, что он работает как задумывалось.


    (img (car (gimp-drawable-get-image drawable)))

    Бесполезная конструкция, в скрипт через аргументы функции передается то же самое изображение (аргумент image). Однако оно будет работать, работает и не такое.

    (gimp-context-push)
    ...
    (gimp-context-pop)

    В одниночном скрипте смотрится очень странно, такая конструкция имеет смысл только при сооружении цикла для пакетной обработки.

    (gimp-selection-none img)

    Тоже пока не ясно к чему это.

    SF-COLOR _"Border color" '(255 255 255)

    Это хорошо, но он нигде не применяется, если вы хотите закрасить слой, то нужно примерно так сделать;

    (gimp-context-set-foreground color)
    (gimp-edit-fill layer 0)
    (gimp-context-set-foreground original_color)
    #1567

    alenari
    Участник

    Спасибо, вы очень помогли)
    И очень понятно все объяснили

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

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