GIMP «Ошибка: оценка: несвязанная переменная: новое изображение» При выполнении скрипта

#gimp #script-fu

#gimp #сценарий-fu

Вопрос:

Я загрузил скрипт для пакетного преобразования изображений в файл .gbr, он устарел и не работает с текущей версией GIMP. Я мало что знаю о скрипте-фу, поэтому, когда я получил первую ошибку «Ошибка: set!: несвязанная переменная: a», я провел поиск и обнаружил, что после GIMP 2.4 при первоначальном определении переменных вы используете «define», а не «set!».

Я исправил все эти экземпляры, а затем получил эту новую ошибку «Ошибка: оценка: несвязанная переменная: новое изображение». Ошибка довольно расплывчата, о какой ссылке на «newimage» идет речь, поэтому я начал менять объявленные переменные с «define» обратно на «set!», Потому что я знаю, что выдает ошибку, и это означает, что код не выполнил ссылку на «newimage», с которой у него проблема.

Я изменил «filename2» и получил ошибку «set!», Которая находится в конце блока, поэтому я знаю, что что-то происходит в последнем блоке.

Я действительно не хочу проходить учебные пособия по написанию сценариев в руководстве GIMP и узнавать о том, чтобы, возможно, получить мой ответ после лучшего понимания кода, хотя я уже прочитал некоторые (единственный код, с которым я знаком, — это C ). У меня также есть курс цифровой живописи, к которому мне нужно вернуться, так что, надеюсь, есть кто-то, кто может пролить свет на эту проблему. Заранее спасибо.

     (define (brush-batch load opt name filename spacing location)
(define a(cond (( equal? opt 0 ) ".jpg" )
               (( equal? opt 1 ) ".bmp" )
               (( equal? opt 2 ) ".xcf" )
               (( equal? opt 3 ) ".png" )
               (( equal? opt 4 ) ".gif" )))

(let* ((filelist (cadr (file-glob (string-append load "\*" a)  1))) 
       (s 1))
(while filelist
    (let* (
        (loadfile (car filelist))
        (image (car (gimp-file-load RUN-NONINTERACTIVE loadfile loadfile)))
        )


(gimp-image-flatten image)
(define drawable (gimp-image-get-active-drawable image))
(if (= 1 (car (gimp-selection-is-empty image)))
(gimp-selection-all image))
(gimp-displays-flush)
(gimp-edit-copy (car drawable) )
(define selection-bounds (gimp-selection-bounds image))
(define sx1 (cadr selection-bounds))
(define sy1 (caddr selection-bounds))
(define sx2 (cadr (cddr selection-bounds)))
(define sy2 (caddr (cddr selection-bounds)))
(gimp-image-delete image)
(define swidth  (- sx2 sx1))
(define sheight (- sy2 sy1))
(define newimage (gimp-image-new swidth sheight 0))
(define newlayer (gimp-layer-new (car newimage) swidth sheight 1 "newlayer" 100 0))
(gimp-image-add-layer (car newimage) (car newlayer) 0)
(gimp-drawable-fill (car newlayer) 3)
(gimp-edit-paste (car newlayer) 0 )
(gimp-image-flatten (car newimage))
(define active (gimp-image-get-active-drawable (car newimage)))
(gimp-desaturate (car active))
(gimp-image-convert-grayscale (car newimage))
(gimp-displays-flush)
(gimp-selection-all (car newimage))
(define filename2 (string-append location "/" filename (string-append (number->string s))".gbr"
))
(file-gbr-save 1 (car newimage) (car active) filename2 (string-append name (number->string s)) spacing (string-append name (number->string s))))
(define s (  s 1))
(gimp-image-delete (car newimage))
(define filelist (cdr filelist))))
)
(script-fu-register "brush-batch"
            "<Toolbox>/Xtns/Script-Fu/Gimp-talk.com/Brush-batch..."
            "turns a folder of files into brush's works with jpg, bmp, xcf, png and gif"
            "Karl Ward"
            "Karl Ward"
            "April 2006"
            ""
            
            SF-DIRNAME    "Load from" ""
            SF-OPTION     "File Type"'("jpg" "bmp""xcf""png""gif")

                SF-STRING     "Brush Name" "name"
                SF-STRING     "File Name" "filename"
                SF-ADJUSTMENT "spacing"         '(25 0 1000 1 1 1 0)
                SF-DIRNAME    "SAVE TO FOLDER" "")


   
 

Ответ №1:

Было бы проще, если бы вы указали нам источник исходного скрипта, чтобы мы могли подсказать, как вы можете сделать его совместимым с текущей версией GIMP.

Просто измените все «определяет» на «установить!» явно неверно, поэтому я пошел и нашел оригинал здесь: https://www.deviantart.com/kward1979uk/art/GIMP-Batch-brush-converter-31179822

Теперь вам нужно назначить переменные, прежде чем пытаться повторно присвоить им значение с помощью set! , что делается просто путем установки для них значения внутри раздела let * вверху. Также условие while теперь требует проверки на ненулевое значение.

 (define (brush-batch load opt name filename spacing location)
  (let* (
        (a
          (cond 
            (( equal? opt 0 ) ".jpg" )
            (( equal? opt 1 ) ".bmp" )
            (( equal? opt 2 ) ".xcf" )
            (( equal? opt 3 ) ".png" )
            (( equal? opt 4 ) ".gif" )
          )
        )
        (filelist (cadr (file-glob (string-append load "\*" a)  1)))
        (s 1)
        (drawable 0) (selection-bounds 0) (sx1 0) (sx2 0) (sy1 0) (sy2 0) (swidth 0) (sheight 0)
        (newimage 0) (newlayer 0) (active 0) (filename2 "")
    )
    (while (not (null? filelist))
      (let* (
              (loadfile (car filelist))
              (image (car (gimp-file-load RUN-NONINTERACTIVE loadfile loadfile)))
            )
 

Комментарии:

1. Просто измените все «определяет» на «установить!» и у вас есть оригинал. Это буквально все, что я изменил, поэтому нет необходимости загружать оригинал. С другой стороны, я только что нашел файл .gbr на своем рабочем столе, поэтому он выводится даже с ошибкой. Я не знаю, что происходит. Я не проверял размер файла и еще не пробовал помещать в папку brushes.

2. Ваш код почти сработал…. Проблема теперь в том, что он создал .gbr для каждого png!