以下脚本旨在通过Gimp CLI界面调用,它将当前目录中所有PNG的颜色模式更改为索引:
(define (script-fu-batch-indexify pattern)
(let* ((filelist (cadr (file-glob pattern 1))))
(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))))
(gimp-image-convert-indexed image NO-DITHER MAKE-PALETTE 256 0 0 "")
(gimp-file-save RUN-NONINTERACTIVE image drawable filename filename)
(gimp-image-delete image))
(set! filelist (cdr filelist)))))
此脚本运行良好,但是它要求当前目录中的每个PNG都没有索引。找到索引的PNG时,它将立即中止。我的意图是使其跳过索引PNG。我相信最好的方法是这样的:
(define (script-fu-batch-indexify pattern num-cols)
(let* ((filelist (cadr (file-glob pattern 1))))
(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))))
(unless (gimp-drawable-is-indexed image) ; Now it does not work anymore...
(gimp-image-convert-indexed image NO-DITHER MAKE-PALETTE num-cols 0 0 "")
(gimp-file-save RUN-NONINTERACTIVE image drawable filename filename)
(gimp-image-delete image)))
(set! filelist (cdr filelist)))))
但是这样做会阻止脚本运行!它执行没有任何错误,也没有索引任何未索引的PNG。我尝试使用if
,但结果相同。那么,我在这里出错了吗?
((我在Linux Mint 19.3上使用Gimp 2.8.22,]
该脚本未按照通常编写Scheme的方式进行编码:我们尽力避免使用set!
操作,可以使用递归而不是while
循环来实现您所做的工作-在函数式编程风格中,这就是推荐方式。
话虽如此,我看不到您的代码有任何明显的缺陷,您确定此表达式对于任何图像而言实际上都是错误的吗?
(gimp-drawable-is-indexed image)
尝试在unless
表达式之前打印上述结果,然后看看它显示的内容。从终端启动Gimp并查看控制台:
(print (gimp-drawable-is-indexed image))
(unless (gimp-drawable-is-indexed image)
使用这样的打印:
(display (string-append "\n Indexed:" (number->string (car (gimp-drawable-is-indexed drawable))) "< \n"))
您必须为(display ..)
创建一个字符串
首先在PDB中查找gimp-drawable-is-indexed,返回int32=> [(数字->字符串]但是所有返回列表的函数=> [(car(..]
(gimp-drawable-is-indexed .)
需要一层而不是图像。