Frage

Verwenden Sie GIMP 2.6.6 für Mac OS X (unter x11), wie von gimp.org heruntergeladen.

Ich versuche, einen langweiligen manuellen Prozess mit Skript-Fu zu automatisieren. Ich musste den Namen der Bilddatei analysieren, um verschiedene Ebenen als neue Dateien mit einem Suffix auf dem Original -Dateinamen zu speichern.

Meine ursprünglichen Versuche gingen so, scheiterten aber, weil (string-search ...) Scheint nicht unter 2,6 verfügbar zu sein (eine Änderung des Skriptmotors?).

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

Dann versuchte ich zu benutzen diese Information Um den Basis -Dateinamen mithilfe von Regex zu decken, aber analysieren (re-match-nth ...) wird auch nicht erkannt.

(if (re-match "^(.*)[.]([^.]+)$" filename buffer)
    (set! basefilename (re-match-nth orig-name buffer 1))
    )

Und während der Wert aus dem Vektor ohne Fehler abreißt, wird der resultierende Wert nicht als Zeichenfolge angesehen, wenn er an übergeben wird (string-append ...).

(if (re-match "^(.*)[.]([^.]+)$" filename buffer)
    (set! basefilename (vector-ref buffer 1))
    ) 

Ich denke, meine Frage ist also, wie würde ich den Basis -Dateinamen analysieren?

War es hilfreich?

Lösung

Kontext

GIMP 2.6.6 Windows Vista SP2

Tor

Extrahieren Sie den Grundnamen des ursprünglichen Dateinamens ohne seine Erweiterung.

Symptom

Fehler: Eval: Ungebundene Variable: Wiederholungsnot

Möglicher Vorschlag

GIMP -Menü "Filter" > "Skript-Fu" > "Konsole"

Fügen Sie im Eingabefeld die folgende Skript-FU-Definition der Funktion ein und klicken Sie auf die EINTRETEN Schlüssel:

(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

Um die Funktion zu testen, geben Sie ein:

(filename-basename "screen.xcf")

Die Skript-Fu-Konsole antwortet:

"screen"

Andere Tipps

Nicht wirklich eine korrekte Lösung:

> (Dateiname-Basename "this.is.a.long.filename.jpg"))

"Dies"

Eine bessere Implementierung:

(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)
  )
 )
)

Meine Version spaltet den Dateinamen (f) in Teile auf, die durch das Trennzeichen ("." Tropfen letzter Teil; und combination sie erneut mit dem Trennzeichen

(define (pc-drop-extension f) 
  (unbreakupstr (butlast (strbreakup f ".")) ".")  )

Also

(pc-drop-extension "ab.cd.efi") -> "ab.cd"

und

(pc-drop-extension "ab/cd.ef/ghi.jkl.mno") -> "ab/cd.ef/ghi.jkl"

Vielen Dank, Philcolbourn, dass er auf eine "einfache" Art und Weise hingewiesen hat, dies zu tun. Leider ist die Butlast -Funktion veraltet:http://www.gimp.org/docs/script-fu-update.html#deprecated

Hier ist die Version von Philcolbourn mit dem vorgeschlagenen Ersatz:

(define (drop-extension filename)
  (unbreakupstr (reverse (cdr (reverse (strbreakup filename ".")))) ".")
)

Wie in GIMP 2.8 "GIMP-Image-Get-Uri" muss verwendet werden, um den Dateinamen einer JPG-Datei zu erhalten, aber Gimp-Image-Get-URI liefert den vollständigen Pfad diese Funktion, um nur den Namen des Namens zu extrahieren Bild (ohne das Suffix ".jpg"):

(Lassen* (
(Uriname (Auto (Gimp-Image-Get-Uri-Bild))))
(Basisame (Auto (Rückseite (Strefreakup (Auto (Strreakup Uriname ".") "/"))))
...
)
...
)

Für diejenigen, die eine echte String-Replace-Funktionalität suchen, finden Sie hier eine Funktion, die ich für die Verwendung in Skript FU geschrieben habe

(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 "")
    )
)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top