11

gimp.orgからダウンロードしたMACOSX(X11の下)でのGimp2.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

ゴール

元のファイル名のベース名を拡張子なしで抽出します。

症状

エラー:eval:バインドされていない変数: re-match-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と同様に、JPGファイルのファイル名を取得するには「gimp-image-get-uri」を使用する必要がありますが、gimp-image-get-uriは完全なパスを提供するため、この関数を使用して、 pic(サフィックス ".jpg"なし):

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

。 ..

于 2013-10-12T09:25:04.653 に答える
0

真の文字列置換機能をお探しの方のために、ScriptFuで使用するために作成した関数を次に示します。

(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 に答える