从gimp.org下载使用Gimp 2.6.6 for MAC OS X(在X11下)。
我正在尝试使用Script-Fu自动化无聊的手动过程。我需要解析图像文件名,以便使用原始文件名上的后缀将各种图层保存为新文件。
我原来的尝试是这样但是失败了,因为(string-search ...)
似乎在2.6下没有可用(对脚本引擎的更改?)。
(set! basefilename (substring filename 0 (string-search "." filename)))
然后我尝试使用this information使用正则表达式解析基本文件名,但也无法识别(re-match-nth ...)
。
(if (re-match "^(.*)[.]([^.]+)$" filename buffer)
(set! basefilename (re-match-nth orig-name buffer 1))
)
虽然从矢量中拉出值没有错误,但在将结果值传递到(string-append ...)
时,结果值不会被视为字符串。
(if (re-match "^(.*)[.]([^.]+)$" filename buffer)
(set! basefilename (vector-ref buffer 1))
)
所以我想我的问题是,我将如何解析基本文件名?
答案 0 :(得分:8)
不是真正正确的解决方案:
> (filename-basename“this.is.a.long.filename.jpg”)
“这”
更好的实施:
(define (morph-filename orig-name new-extension)
(let* ((buffer (vector "" "" "")))
(if (re-match "^(.*)[.]([^.]+)$" orig-name buffer)
(string-append (substring orig-name 0 (car (vector-ref buffer 2))) new-extension)
)
)
)
答案 1 :(得分:5)
GIMP 2.6.6 Windows Vista SP2
提取原始文件名的基本名称,不带扩展名。
错误:eval:未绑定的变量: 重新匹配-第n
GIMP菜单“过滤器”> “ Script-Fu ”> “的控制台强>”
在输入框中,粘贴以下功能的Script-Fu定义 然后点击 ENTER 键:
(define (filename-basename orig-name)
(car (strbreakup orig-name "."))
; Nimmzo 09/09/30: the string split function strbreakup is defined
; in the compatibility file from SIOD to TinyScheme:
; C:\Program Files\GIMP\share\gimp\2.0\scripts\script-fu-compat.init
) ; end filename-basename
要测试该功能,请输入:
(filename-basename "screen.xcf")
Script-Fu控制台回答:
"screen"
答案 2 :(得分:5)
我的版本将文件名(f)拆分为分隔符分隔的部分(在本例中为“。”);丢掉最后一部分;并再次将它们与分隔符重新组合
(define (pc-drop-extension f)
(unbreakupstr (butlast (strbreakup f ".")) ".") )
所以
(pc-drop-extension "ab.cd.efi") -> "ab.cd"
和
(pc-drop-extension "ab/cd.ef/ghi.jkl.mno") -> "ab/cd.ef/ghi.jkl"
答案 3 :(得分:3)
非常感谢philcolbourn指出了一种“简单”的方法。 不幸的是,butlast函数已被弃用: http://www.gimp.org/docs/script-fu-update.html#deprecated
这是philcolbourn的版本,建议替换:
(define (drop-extension filename)
(unbreakupstr (reverse (cdr (reverse (strbreakup filename ".")))) ".")
)
答案 4 :(得分:1)
在Gimp 2.8中,“gimp-image-get-uri”必须用于获取JPG文件的文件名,但gimp-image-get-uri提供了完整的路径,我使用此函数只提取图片的名称(不带后缀“.jpg”):
(让*(
(uriname(car(gimp-image-get-uri IMAGE)))
(basename(汽车(反向(strbreakup(汽车(strbreakup uriname“。”))“/”))))
...
)
...
)
答案 5 :(得分:0)
对于那些寻找真正的字符串替换功能的人来说,这是我在Script Fu中使用的函数
(define (string-replace strIn strReplace strReplaceWith)
(let*
(
(curIndex 0)
(replaceLen (string-length strReplace))
(replaceWithLen (string-length strReplaceWith))
(inLen (string-length strIn))
(result strIn)
)
;loop through the main string searching for the substring
(while (<= (+ curIndex replaceLen) inLen)
;check to see if the substring is a match
(if (substring-equal? strReplace result curIndex (+ curIndex replaceLen))
(begin
;create the result string
(set! result (string-append (substring result 0 curIndex) strReplaceWith (substring result (+ curIndex replaceLen) inLen)))
;now set the current index to the end of the replacement. it will get incremented below so take 1 away so we don't miss anything
(set! curIndex (-(+ curIndex replaceWithLen) 1))
;set new length for inLen so we can accurately grab what we need
(set! inLen (string-length result))
)
)
(set! curIndex (+ curIndex 1))
)
(string-append result "")
)
)