Gimp 3: Bild mit Python verkleinern
So schön hochaufgelöste Bilder auch sind, häufig reicht ein kleines Vorschaubild, egal ob als Ausgabe für eine Website oder um schnell ein Bilderverzeichnis zu durchsuchen. In der Python-Konsole von Gimp ist diese Aufgabe schnell erledigt. Ein Bild kann auf diesem Weg natürlich auch vergrössert werden.
Für Neugierige gibt es hier das ganze Programm.
Schritt für Schritt
Zunächst ein Script um ein einzelnes Bild in einem kleinerern Format zu speichern. Ein paar Module werden für den Zugriff auf die Funktionen von Gimp benötigt:
from gi.repository import Gimp from gi.repository import Gio
Der Name der Zieldatei könnte auch einfach mit einigen Stringoperationen erzuegt werden, die Verwendung des Moduls pathlib macht es langfristig sicherer und besser erweiterbar.
from pathlib import Path
Ein paar Parameter für das Programm:
f = '' # der Dateiname: test.jpg nw = 750 # Breite neues Bild nh = 500 # Hoehe fp = Path(f) gfile = Gio.File.new_for_path(f)
Der Dateiname wird für ein Path- und Gio.FileObjekt und verwendet. Letzteres benötig leider eine Zeichenkette.
img = Gimp.file_load(Gimp.RunMode.NONINTERACTIVE, gfile) res = img.policy_rotate(True)
Das Bild wird geladen und in die richtige Richtung gedreht. Ohne den Aufruf von policy_rotate() würde ein Bild im Hochformat anschliessend im Querformat erscheinen.
res = img.scale(nw, nh)
Die Skalierung des Bildes ist mit einem Funktionsaufruf erledigt.
nf = fp.stem + '_' + str(nw) + 'x' + str(nh) + fp.suffix tfile = Gio.File.new_for_path(nf)
Der Name der neuen Datei bekommt die Breite und Höhe zur Unterscheidung vom Original.
pdb = Gimp.get_pdb() export_proc = pdb.lookup_procedure("file-jpeg-export") config = export_proc.create_config() config.set_property("run-mode", Gimp.RunMode.NONINTERACTIVE) config.set_property("options", None) config.set_property("smoothing", 0) config.set_property("optimize", True) config.set_property("progressive", True) config.set_property("cmyk", False) config.set_property("sub-sampling", "sub-sampling-1x1") config.set_property("baseline", True) config.set_property("restart", 0) config.set_property("dct", "integer") config.set_property("image", img) config.set_property("file", tfile) config.set_property("quality", 0.92) result = export_proc.run(config)
Die Parameter für die Speicherung als JPEG erfordern eine Menge Tipparbeit.
if img.is_valid(): res = img.delete()
Danach muss nur noch das Bild aus dem Speicher entfernt werden.
Verbesserungsmöglichkeiten
Das Script besteht nur aus die notwendigsten Funktionen. Es gibt eine Menge Raum für Verbesserungen und Erweiterungen:
- Welches Format (hoch/quer) hat das Originalbild? Die Skalierung muss dann eventuell die Werte tauschen.
- Wie ist das Seitenverhältnis des Originals. Muss es beschnitten werden um nach dem Skalieren nicht verzerrt zu wirken?
- Ein quadratisches Format wird nicht berücksichtigt.
- Fehlerprüfungen: Die Rückgabewerte der Funtkionsaufrufe liefern im Erfolgsfall True oder im Fall der PDB-Funktion ein Ergebnisobjekt.
Ein ganzes Bilderverzeichnis umwandeln
Für ein Verzeichnis ist wenig mehr zu machen. Das vorgestellte Script muss für eine Liste von Bildern ausgeführt werden. So eine Liste ist am einfachsten mit dem Modul glob zu erstellen.
import glob files = list ( glob.iglob('*.jpg') ) for f in files: ...
Die for-Schleife arbeitet die Liste dann ab.
Das ganze Programm
Hier noch mal das Programm zum Skalieren eines Bildes mit Python-Fu in einem Stück:
from gi.repository import Gimp from gi.repository import Gio from pathlib import Path f = '' # der Dateiname: test.jpg nw = 750 # Breite neues Bild nh = 500 # Hoehe fp = Path(f) gfile = Gio.File.new_for_path(f) img = Gimp.file_load(Gimp.RunMode.NONINTERACTIVE, gfile) res = img.policy_rotate(True) res = img.scale(nw, nh) nf = fp.stem + '_' + str(nw) + 'x' + str(nh) + fp.suffix tfile = Gio.File.new_for_path(nf) pdb = Gimp.get_pdb() export_proc = pdb.lookup_procedure("file-jpeg-export") config = export_proc.create_config() config.set_property("run-mode", Gimp.RunMode.NONINTERACTIVE) config.set_property("options", None) config.set_property("smoothing", 0) config.set_property("optimize", True) config.set_property("progressive", True) config.set_property("cmyk", False) config.set_property("sub-sampling", "sub-sampling-1x1") config.set_property("baseline", True) config.set_property("restart", 0) config.set_property("dct", "integer") config.set_property("image", img) config.set_property("file", tfile) config.set_property("quality", 0.92) result = export_proc.run(config) if img.is_valid(): res = img.delete()
Letzte Aktualisierung: 2025-02