我下载了一个脚本来批量转换图像为.gbr,但它已经过时了,不能与当前版本的GIMP一起工作。我不太了解script-fu,所以当我得到第一个错误" error : set!:unbound variable: a“时,我进行了搜索,发现在GIMP 2.4之后,最初定义变量时使用的是"define”而不是"set!“。
我修复了所有这些实例,然后得到了这个新的错误" error : eval: unbound variable: newimage“。这个错误对"newimage“的引用非常模糊,所以我开始将声明的变量从"define”改回“set”!因为我知道这会给我一个错误,这意味着代码没有执行它有问题的"newimage“的引用。
我把"filename2“改成了"set!”错误,这是在块的末尾,所以我知道它在最后一个块中发生了什么。
我真的不想翻阅GIMP手册中的script-fu教程,学习如何在更好地理解代码后得到答案,尽管我已经读过一些(我唯一熟悉的代码是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" "")发布于 2021-02-02 17:27:08
如果你给我们指出一个原始脚本的源代码,我们就可以建议你如何让它与当前版本的GIMP兼容,这会更容易。
只需将所有的“定义”更改为“设置!”显然不是真的,所以我在这里找到了原件:https://www.deviantart.com/kward1979uk/art/GIMP-Batch-brush-converter-31179822
现在,在尝试使用set!重新赋值之前,必须对变量进行赋值,这只需将它们设置为顶部let*部分中的某个值即可。此外,while条件现在需要测试非null。
(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)))
)https://stackoverflow.com/questions/65988289
复制相似问题