11

使用从 gimp.org 下载的用于 MAC OS X(X11 下)的 Gimp 2.6.6。

我正在尝试使用 Script-Fu 自动化一个无聊的手动过程。我需要解析图像文件名以使用原始文件名的后缀将各个图层保存为新文件。

我最初的尝试是这样的,但失败了,因为(string-search ...)在 2.6 下似乎不可用(更改脚本引擎?)。

(set! basefilename (substring filename 0 (string-search "." filename))) 

然后我尝试使用此信息使用正则表达式解析出基本文件名,但(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))
    ) 

所以我想我的问题是,我将如何解析基本文件名?

4

6 回答 6

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)
  )
 )
)
于 2010-06-06T17:08:14.037 回答
6

语境

GIMP 2.6.6 Windows Vista SP2

目标

提取原始文件名的基本名称,不带扩展名。

症状

错误:评估:未绑定的变量: 重新匹配-nth

可能的建议

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"
于 2009-09-30T09:48:52.963 回答
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"
于 2012-06-10T04:19:31.367 回答
4

非常感谢 philcolbourn 指出了一种“简单”的方法来做到这一点。不幸的是,不推荐使用 butlast 函数:http: //www.gimp.org/docs/script-fu-update.html#deprecated

这是 philcolbourn 的建议替换版本:

(define (drop-extension filename)
  (unbreakupstr (reverse (cdr (reverse (strbreakup filename ".")))) ".")
)
于 2012-09-08T14:22:11.307 回答
1

在 Gimp 2.8 中,必须使用“gimp-image-get-uri”来获取 JPG 文件的文件名,但 gimp-image-get-uri 提供了完整的路径,我使用此函数仅提取文件的名称图片(没有后缀“.jpg”):

(let* (
(uriname (car (gimp-image-get-uri IMAGE)))
(basename (car (reverse (strbreakup (car (strbreakup uriname ".")) "/"))))
...
)
。 ..
)

于 2013-10-12T09:25:04.653 回答
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 "")
    )
)
于 2012-07-16T16:48:27.520 回答