RSS-/Atom-Feed Twitter
Site is read-only, email is disabled

Tutorial: Skript-Fu: Mehrere Bilder skalieren

Verfasst von · Erstellt am 16 Sep 2006, zuletzt bearbeitet vor fast 14 Jahren CC BY-NC-Lizenz

Motivation

Sehr häufig will man eine große Anzahl von Bildern (z.B. Urlaubsfotos) auf eine kleine Größe bringen, z.B. auf 1024x768, um sie ins Web stellen zu können. Das geht natürlich auch mit einem Skript.

Tutorial-Details

  1. 1

    Zuerst sollte erwähnt werden, dass diese Aufgabe (mehrere Bilder automatisch verkleinern) auch ohne eigenes Skript-Fu gelöst werden kann. Dazu benötigt man ImageMagick, ein Programm, welches bei den meisten Linux-Distributionen mitgeliefert wird und über den Paketmanager (z.B. apt oder Synaptic bei Ubuntu) installiert werden kann.

    ImageMagick stellt verschiedene Programme zur Verfügung, mit denen Bilder in verschiedenster Weise bearbeitet werden können. Mit Hilfe der Shell (hier: bash) können mehrere Bilder auf einmal bearbeitet werden.

    Beispiel:
    mkdir small
    for f in *.jpg
    do convert $f -resize 1024×768 small/$f.gif
    done

    Dieses Skript legt 1) ein Verzeichnis “small” an, geht 2) alle *.jpg-Dateien im aktuellen Verzeichnis durch und führt 3) für jede Datei das convert-Programm aus, der eine auf 1024×768 verkleinerte Version des Bildes im Verzeichnis “small” abelegt.

  2. 2

    Für echte GIMP-Benutzer ist es natürlich trotzdem erforderlich, dass auch im GIMP mehrere Bilder auf einmal verkleinert werden können.

    Dazu kann man folgendes Skript-Fu verwenden:

    [code]
    (define (script-fu-batch-resize globexp newx newy)
    (define (resize-img n f)
    (let* ((fname (car f))
    (img (car (gimp-file-load 1 fname fname))))
    (gimp-image-undo-disable img)
    (gimp-image-scale img newx newy 0 0)
    (gimp-file-save 1 img (car (gimp-image-get-active-drawable img)) fname fname)
    (gimp-image-delete img)
    )
    (if (= n 1) 1 (resize-img (- n 1) (cdr f)))
    )
    (set! files (file-glob globexp 0))
    (resize-img (car files) (car (cdr files)))
    )

    ; Im GIMP und im Menü registrieren
    (script-fu-register “script-fu-batch-resize”
    _"_Mehrere Bilder verkleinern…"
    “Mehrere Bilder auf einmal auf die gleiche Größe bringen”
    “Richard Hirner”
    “2006, Richard Hirner”
    “Sep 7, 2006”
    ""
    SF-STRING “Zu konvertierende Dateien” “/pfad/zu/bildern/*.jpg”
    SF-VALUE “Neue horizontale Größe” “1280”
    SF-VALUE “Neue vertikale Größe” “1024”)
    (script-fu-menu-register “script-fu-batch-resize”
    /Xtns/Misc”)
    [/code]

    Für GIMP 2.2 muss die Registrierung leicht geändert werden.

    Die einzigen (für Programmierer) interessanten Stellen im Skript sind die GIMP-Funktion file-glob und die Scheme-Iteration der Liste durch die endstämmig-rekursive Funktion resize-img.

    Um das Skript zu verstehen, sind Scheme-Grundlagen nötig; siehe auch das Tutorial “Skript-Fu-Einführung” (Link rechts oben).

  3. 3

    Am einfachsten ist es, die Datei batch-resize.scm-2.4.scm bzw. batch-resize-2.2.scm (Download-Links rechts oben) einfach herunterzuladen und in das GIMP-Skript-Verzeichnis zu kopieren. In Linux findet man dieses Verzeichnis im Home-Verzeichnis unter “~/.gimp-2.2” bzw “~/.gimp-2.3”; in Windows am besten ins globale Verzeichnis nach “Programme\Gimp-2.x\share\gimp\2.0\scripts”

    Beim nächsten Start von GIMP bzw. nach einem “Skripte auffrischen” ist das Skript unter Xtns / Skript-Fu / Verschiedenes / Mehrere Bilder verkleinern… (2.2) bzw. Xtns / Verschiedenes / Mehrere Bilder verkleinern… (2.4) zu finden.

  4. 4

    Nun einfach den Pfad zu den Bildern und die gewünschte Größe eingeben und auf OK klicken.

    Viel Spaß!

Kommentare

Hier kannst du Kommentare, Fragen und Anregungen loswerden. Der Autor und die anderen Benutzer können deinen Beitrag sehen und darauf antworten.

Natürlich kannst du auch im Chat fragen.

Abo-Verwaltung

Diese Funktion steht nur angemeldeten Benutzern zur Verfügung.

Benutzerbewertung

Dieses Thema (Skript-Fu: Mehrere Bilder skalieren) wurde insgesamt mit 5,0 von 5 Punkten bewertet.

New comments are disabled because of spam.

Boo
vor mehr als 11 Jahren

für alle, die hier landen weil sie nur gimp und keine root rechte haben und auf dieses script quasi angewiesen sind in gimp 2.6 zeiten......

hier mein 2.6 mod. http://www.multiupload.nl/LBWH9IC91S

ist quasi die 2.4 mit den nötigen modifikationen und ner readme dazu als zip.

enjoy!

Grafino Mitglied seit mehr als 11 Jahren Grafino 2 Kommentare
vor mehr als 11 Jahren

Nachtrag zu Unten: Die Ausgangsbilder haben oft unterschiedliche Größen :-( ..sonst wäre es ja einfach ;-)

Grafino Mitglied seit mehr als 11 Jahren Grafino 2 Kommentare
vor mehr als 11 Jahren

Hallo,
ich bin bin, was Bildbearbeitung-und damit auch Gimp-angeht, absoluter Newebe, Habe bisher nur mehr schelcht als recht ein wenig mit Beleuchtungseffekten rumgebastelt. Jetzt muss ich öfter viele Bilder, die teilweise auch in Unterordnern sind, auf eine einheitliche Grösse (1000 x 781) bringen. Zu beachten dabei: Das Verhältnis muss behalten werden, so dass nur die passende Seite als Mass auszuwählen ist. dann das ganze auf eine weisse Ebene bringen wg. des HG, einmal so speichern, einmal zusätzlich mit einer weiteren Ebene ( einem Hinweis) speichern. Geht so was überhaupt per script?
Ich nutze Gimp portable und weiß im Moment auch gar nicht, wo ich das script speichern sollte. Bin ich hier nun richtig oder von der Kenntnis her zu low? Bin ansonsten nicht so ganz unbedarft ;-)
Schon mal Danke für eine Antwort!

441fp
vor mehr als 12 Jahren

das script macht mir seit wenigen tagen probleme, die mir bisher nicht aufgefallen sind. FEHLERMELDUNG: Error: car: argument 1 must be: pair

die onlinesuche hat mir nicht weitergeholfen und bin dann zufällig beim draufsehen auf eine merkwürdigkeit gestossen.

das problem tritt auf, wenn kein bild mir der endung '.JPG' (großbuchstaben) im verzeichnis ist. bei einem versuche waren es dann 2 dateien mit '.JGP' und 4 dateien mit '.jpg' (kleingeschrieben). die zwie mit JPG wurden dann auch verkleinert, die 4 (.jpg) wurden ohne fehlermeldung übergangen. nachdem ich die 4 von '.jpg' auf '.JPG' umbenannt habe, wurde auch diese richtig in der größe verändert.
hab versucht im skript fast unten in der zeile
### (let* ((files (file-glob (string-append SourceFolder "/*.JPG") 0))) #####
das *.JPG durch *.jpg (klein) zu ersetzte.
es werden dennoch nur dateien mit groß geschriebener dateiendung vom skript erkannt und verarbeitet.

gibt es da eine lösung dass groß- und kleinschreibung egal ist?

thks vorweg
lg franz

redforce Mitglied seit etwa 18 Jahren redforce 230 Kommentare
vor mehr als 12 Jahren

Wenn's nur um das Skalieren geht, verwende ich auch convert bzw. mogrify und dazu das Tool parallel, damit alle Prozessoren genutzt werden: http://www.gnu.org/software/parallel/man.html

Chnuettler
vor mehr als 12 Jahren

Das mit dem convert (1) ist ja super.
- mit vi und Copy+Paste small.sh erstellen (5 sec)
- chmod u+x small.sh (1 sec)
- ./small.sh
und nach ganzen sechs Sekunden ist meine Mühle am skalieren.

Phonglan
vor fast 13 Jahren

Habe den Vorschlag von Petr Andreev aufgegriffen und zusätzlich den Code mit der Funktion erweitert, dass der Quell- und Zielordner eingegeben werden können:

Läuft unter GIMP 2.6.11:

;--- Im GIMP und im Menü registrieren ---------

(script-fu-register
"script-fu-resize" ;Funktionsname
_"_Bilder eines Ordners skalieren" ;Menutext
"Alle Bilder eines Ordners skalieren und in einem\
Zielordner abspeichern" ;Beschreibung
"Stefan Betschart" ;Author
"Copyright 2012, sb" ;Copyright
"01.01.2012" ;Erstellungsdatum
"" ;Bildtyp auf dem das Skript basiert
SF-DIRNAME "Quellenverzeichnis" "C:\\Daten\\" ;String-Variable
SF-DIRNAME "Zielverzeichnis" "C:\\Daten\\ResizedFotos" ;String-Variable
SF-VALUE "Neue Bildbreite" "800" ;Wert-Variable
SF-VALUE "Neue Bildhoehe" "600") ;Wert-variable

(script-fu-menu-register "script-fu-resize"
"/File/Resize")

;--- Code -------------------------------------

(define (script-fu-resize SourceFolder TargetFolder max-x max-y)

(define (new-sizes img newx newy)

(let* ( (width (car (gimp-image-width img)))
(height (car (gimp-image-height img)))
(ratio (min (/ newx width) (/ newy height)))
)

(list (* ratio width) (* ratio height))
)
)

(define (resize-img n f)

(let* ( (fname (car f))
(img (car (gimp-file-load 1 fname fname)))
(new-xy (new-sizes img max-x max-y))
(Targetfname fname)
)

(gimp-image-undo-disable img)
(set! Targetfname (string-append TargetFolder "\\" (car(gimp-image-get-name img))))
(gimp-image-scale img (car new-xy) (cadr new-xy))
(gimp-file-save 1 img (car (gimp-image-get-active-drawable img)) Targetfname Targetfname)
(gimp-image-delete img)

)

(if (= n 1) 1 (resize-img (- n 1) (cdr f)))

)

(let* ((files (file-glob (string-append SourceFolder "\\*.jpg") 0)))

(resize-img (car files) (car (cdr files)))
)

)

tandalon
vor fast 13 Jahren

leider kann ich das das Script nach der o.a. Installation nirgends finden (GIMP 2.6) Xtns / Verschiedenes / Mehrere Bilder verkleinern… finde ich da nirgends ... Weiß jemand wo ich suchen muss?
Danke!

helmeloh
vor etwa 13 Jahren

Der Kommentar vor 5 Min "mit installiertem ImageMagick genügt mir, bei meinen geringen Ansprüchen im jeweiligen Verzeichnis schon "mogrify -resize irgendwasxirgendwas *.jpg" stammt von mir (helmeloh), aber auf meinem PC war versehentlich redforce angemeldet, sorry.

redforce Mitglied seit etwa 18 Jahren redforce 230 Kommentare
vor etwa 13 Jahren

mit installiertem ImageMagick genügt mir, bei meinen geringen Ansprüchen im jeweiligen Verzeichnis schon "mogrify -resize irgendwasxirgendwas *.jpg"

Christoph
vor mehr als 13 Jahren

Okay, nichts für ungut: hinter dem ersten Anführungszeichen muss stehen. Sobald man den Kommentar postet verschwindet der Text Kleinerzeichen Toolbox Größerzeichen.

Christoph
vor mehr als 13 Jahren

Sagt mal, probiert ihr eigentlich auch aus was ihr schreibt?
Gimp 2.6.10 benötigt folgende letzte Zeile:
"/Filters/Batch/")
Sonst wird das nichts.

autos auctions Albuquerque
vor fast 14 Jahren

I’ve been visiting your blog for a while now and I always find a gem in your new posts. Thanks for sharing.

vizzy
vor fast 14 Jahren

es waere durchaus schlau auch ein ausgabeverzeichnis anzugeben, sonst werden die schoenen originale ueberschrieben. sogesehen.... bevorzuge ich imagemagick, einfach und unumstaendlich und kein scheme gewusel mit versionsproblemen!

margarita
vor etwa 14 Jahren

Hallo zusammen,

ich hab oben den neuen script mit der endung für 2.6 rein gemacht, aber bei mir funktioniert es überhautpt nicht :( wie kann man den einen script öffnen und bearbeiten oder bzw. wie kann ich ein script schreiben, muss man da ein anderes programm für haben damit man scripts schreiben kann?

lg

Margarita

Peter
vor mehr als 14 Jahren

sorry - Fehlerhafte Pfadangabe

Peter
vor mehr als 14 Jahren

Beim Ausführen dieses Skriptes erhalte ich folgende Fehlermeldung:
Fehler beim Ausführen von script-fu-batch-resize:

Error: car: argument 1 must be: pair

Kann mir bitte jemand weiterhelfen?

moewe2 Bewertung für diesen Artikel: 5/5
vor mehr als 14 Jahren

Zu Beitrag 19:

Für Gimp 2.6 muss die letzte Zeile lauten:
"/Filters/Batch/")

Gruß, moewe2.

Ralph Keller
vor mehr als 14 Jahren

Gibt doch von MS ein Tool names Imageresizer, ist direkt im Kontex-Menü eingebunden.

dennis
vor fast 15 Jahren

also bei mir funktioniert es nicht

sowiso
vor mehr als 15 Jahren

Hi, ich habe das Script mal für Gimp 2.6 angepasst:

(define (script-fu-batch-resize globexp max-x max-y)
(define (new-sizes img newx newy)
(let* (
(width (car (gimp-image-width img)))
(height (car (gimp-image-height img)))
(ratio (min (/ newx width) (/ newy height)))
)
(list (* ratio width) (* ratio height))
)
)
(define (resize-img n f)
(let* (
(fname (car f))
(img (car (gimp-file-load 1 fname fname)))
(new-xy (new-sizes img max-x max-y))
)
(gimp-image-undo-disable img)
(gimp-image-scale img (car new-xy) (cadr new-xy))
(gimp-file-save 1 img (car (gimp-image-get-active-drawable img)) fname fname)
(gimp-image-delete img)
)
(if (= n 1) 1 (resize-img (- n 1) (cdr f)))
)
(let* ((files (file-glob globexp 0)))
(resize-img (car files) (car (cdr files)))
)
)
; Im GIMP und im Menü registrieren
(script-fu-register "script-fu-batch-resize"
_"_Mehrere Bilder verkleinern..."
"Mehrere Bilder auf einmal auf die gleiche Größe bringen"
"Richard Hirner"
"2006, Richard Hirner"
"Sep 7, 2006"
""
SF-STRING "Zu konvertierende Dateien" "H:\\Bilder\\2009_05_08_Hochzeit\\Aufbereitet_DVD\\01_Standesamt\\to\\*.jpg"
SF-VALUE "Neue horizontale Größe" "1920"
SF-VALUE "Neue vertikale Größe" "1080")
(script-fu-menu-register "script-fu-batch-resize"
"/Xtns/Misc")

fochat
vor mehr als 15 Jahren

Jep, bei mir mit der Version 2.6.1 geht auch nix :(

zwenny
vor mehr als 15 Jahren

ich habe opensuse mit gimp 2.6.2, da funzt keines der scripte....keine fehlermeldung nix.... :-(

Michael
vor etwa 16 Jahren

Unter Windows und Gimp 2.4.6 klappt es bei mir mit der Zeile:

SF-STRING "Zu konvertierende Dateien" "C:\\Foto_resize\\*.jpg"

Das Zeichen \ muß doppelt geschrieben werden!

Andy
vor mehr als 16 Jahren

Habe ebenfalls das Problem:

Fehler beim Ausführen von
(script-fu-batch-resize "\\Temp\\*.jpg" 1280 1024)

Error: set!: unbound variable: files

Die Fotos liegen unter C:\Temp
der eingegebene Pfad für die zu konvertierenden Dateien war \Temp\*.jpg

Bin Windows XP user
Gimpversion 2.4.6
Skrip benutze ich batch-resize-2.4.scm

könntet ihr mir weiterhelfen was ich falsch mache?

Jens
vor mehr als 16 Jahren

Ich bekomme ebenfalls die Fehlermeldung: Error: set!: unbound variable: files in der Version 2.4.6 unter Win XP Prof SP 3

KeonAthor Mitglied seit mehr als 16 Jahren KeonAthor 1 Kommentar
vor mehr als 16 Jahren

Tach auch. Bekomme ebenfals den fehler Error: set!: unbound variable: files mit Gimp 2.4.5 mit dem script 2.4

Denny Schäfer
vor mehr als 16 Jahren

Bekomme immer wenn ich das Script ausführen möchte

Error: car: argument 1 must be: pair

Benutze GIMP 2.4.5

Dschensen1 Mitglied seit fast 17 Jahren Dschensen1 1 Kommentar
vor fast 17 Jahren

Funktioniert, danke! was mich jedoch noch stört (ohne zu meckern): Die Originaldateien werden übschrieben. Kann man nicht den Dateinamen des verkleinerten Bildes mit einem Zusatz versehen, z.B. File2345.jpg (gross) und das verkleinerte Bild als File2345_k.jpg abspeichern.

Ich finde die Idee auch gut, dass man nur eine Grösse angibt und das Seitenverhältnis beibehält. Ich habe nämlich im Verzeichnis der Urlaubsbilder Hochkantbilder seltsam gestaucht. Das hätte auch Vorteile für Bilder, aus denen man Ausschnitte gewählt hat und sich ein "krummes" Seitenverhältnis ergibt.

Hat das schon mal jemand versucht?

Fleppi
vor etwa 17 Jahren

So läuft es bei mir jetzt mit Gimp 2.4:

(define (script-fu-batch-resize globexp newx newy)
(define (resize-img n f)
(let* ((fname (car f))
(img (car (gimp-file-load 1 fname fname))))
(gimp-image-undo-disable img)
(gimp-image-scale img newx newy)
(gimp-file-save 1 img (car (gimp-image-get-active-drawable img)) fname fname)
(gimp-image-delete img)
)
(if (= n 1) 1 (resize-img (- n 1) (cdr f)))
)
(let* ((files (cadr (file-glob globexp 0))))
(set! files (file-glob globexp 0))
(resize-img (car files) (car (cdr files))))
)

; Im GIMP und im Menü registrieren
(script-fu-register "script-fu-batch-resize"
_"_Mehrere Bilder verkleinern..."
"Mehrere Bilder auf einmal auf die gleiche Größe bringen"
"Richard Hirner"
"2006, Richard Hirner"
"Sep 7, 2006"
""
SF-STRING "Zu konvertierende Dateien" "D:\Fotos\\*.JPG"
SF-VALUE "Neue horizontale Größe" "800"
SF-VALUE "Neue vertikale Größe" "600")
(script-fu-menu-register "script-fu-batch-resize"
"/Xtns/Misc")

Fleppi
vor etwa 17 Jahren

Bei Gimp 2.4.1 und dem Script für 2.4 bekomme ich ebenfalls die Fehlermeldung:
Error: set!: unbound variable: files

Lucas
vor mehr als 17 Jahren

Ist es möglich nur einen Wert zu vergeben und den anderen durch Gimp bestimmen zu lassen zwecks bei Behaltung der Seitenverhältnisse??

Holger
vor mehr als 17 Jahren

Danke an Euch beide Richard und auch Petr Andreev für das Script. Die Änderungen von Peter sind super!

3 Wünsche - keine Ahnung, ob man das realisieren kann:
1. Irfanviev macht es so, dass man wählen kann, wie lang die länge Seite des Fotos gesetzt wird. Das ist sehr komfortabel
2. Wenn man einfache eine maximale Dateigröße oder den Komprimierungswert bestimmen könnte, wäre das auch super. z.B. alle Deteien max. 150 Kbyte.
3. Schön wäre wenn man ein zweites Verzeichnis wählen könnte und die ursprünglichen Dateien erhalten blieben.

Wie gesagt, das sind so meine Ideen. Soll keine Meckerei oder Gängelung sein. Wäre toll, wenn das eine oder andere irgendwie möglich wäre.
Vielen dank an Alle! So macht Open Source Spaß

Holger

alex
vor mehr als 17 Jahren

Hallo,

ich benutze gimp-2.3 und das einlesen des verzeichnisses klappt einfach nicht. es kommt immer die meldung:

Error while executing
(script-fu-batch-resize "/home/alex/test/*.jpg" 1280 1024)

Error: set!: unbound variable: files

brauche hilfe!
vielen dank schonmal!

stefan
vor mehr als 17 Jahren

Hi,
there is a small mistake in the shell script at the top example.

Im angegebenen Beispiel ist ein kleiner Flüchtigkeitsfehler aufgetreten:
=======
Beispiel:
mkdir small
for $f in *.jpg
do convert $f -resize 1024x768 small/$f.gif
done
========
for $f...ist so nicht möglich, die Variable "f" wird ja erst mit Inhalt gefüllt und ist daher zunächst nur mit "f" anzugeben, also:
for f...

...wie gesagt, nur eine Kleinigkeit...
Ich hab hier noch ein kleines praktisches Beispiel von mir hinzugefügt:

me@bash:MeineBilder$ mkdir 640x400.img
me@bash:MeineBilder$ for bild in *.JPG; do convert $bild -resize 640x480 640x400.img/$bild; done;

Steffen
vor mehr als 17 Jahren

Hallo,

unter Windows müsst Ihr statt "/pfad/zu/bildern/*.jpg"

"\pfad\zu\bildern\*.jpg"
notieren, dann geht es auch.

Andi
vor mehr als 17 Jahren

Habe das gleiche Problem wie float!
Habe absolute und relative Pfadangaben probiert.

float Mitglied seit fast 18 Jahren float 1 Kommentar
vor fast 18 Jahren

Hey,
danke für das Script. Leider ruft es bei mir nur eine Fehlermeldung hervor.

Ich nutze Gimp 2.2 unter Kubuntu.
Die fehlermeldung lautet:

"Skript-Fu Fehler beim Ausführen von
(script-fu-batch-resize "/media/daten1/Eigene Dateien/Bilder/Geburtstag Jens 26 + Sanna 24 06.01.2007/*.jpg" 1280 1024)
ERROR: Invalid type for argument 2 to gimp_file_load"

Ich habe das Script 2.2 und 2.4 getestet.Beide Scripte gaben diesen Fehler aus.

Petr Andreev
vor etwa 18 Jahren

Eine verbesserte Version des Skriptes, die verwahrt das Aspekt-Ratio:

(define (script-fu-batch-resize globexp max-x max-y)
(define (new-sizes img newx newy)
(let* (
(width (car (gimp-image-width img)))
(height (car (gimp-image-height img)))
(ratio (min (/ newx width) (/ newy height)))
)
(list (* ratio width) (* ratio height))
)
)
(define (resize-img n f)
(let* (
(fname (car f))
(img (car (gimp-file-load 1 fname fname)))
(new-xy (new-sizes img max-x max-y))
)
(gimp-image-undo-disable img)
(gimp-image-scale img (car new-xy) (cadr new-xy) 0 0)
(gimp-file-save 1 img (car (gimp-image-get-active-drawable img)) fname fname)
(gimp-image-delete img)
)
(if (= n 1) 1 (resize-img (- n 1) (cdr f)))
)
(set! files (file-glob globexp 0))
(resize-img (car files) (car (cdr files)))
)