photomappe.de

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:

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

zum Seitenanfang

Letzte Aktualisierung: 2025-02