photomappe.de

Ein Bild laden und speichern (JPEG)

Für eine Bildbearbeitung ist das Lesen und Schreiben von Dateien eine elementare Funktion. Das Dateiformat JPEG soll hier als populäres Beispiel für eine typische Ein- und Ausgabe von Gimp in einem Python-Script dienen.

Das folgende Beispiel setzt die in der Einleitung gezeigten Imports voraus:

from gi.repository import Gimp
from gi.repository import Gio

Bild laden
Das geladene Bild löschen
Bild speichern - schnell und einfach
Bild speichern - volle Kontrolle
Bild anzeigen
Angezeigtes Bild löschen
Troubleshooting
EXIF, IPTC...

Bild laden

Ein zu bearbeitendes Bild müssen zunächst geladen werden. Dies kann für die Datei mit dem Namen bild.jpg im Startverzeichnis von Gimp wie folgt geschehen:

f = Gio.File.new_for_path('bild.jpg')
img = Gimp.file_load(Gimp.RunMode.NONINTERACTIVE, f)

Die Funktion file_load() öffnet auch beim Aufruf im Interactive-Mode (Angabe von Gimp.RunMode.INTERACTIVE) keinen Fileselektor. Es wird auch einfach nur das Bild geladen.

Das geladene Bild löschen

Die Funktion delete() ist eine Methode des Image. Diese entfernt das Bild wieder aus dem Speicher.

Es ist immer eine gute Idee die Variable für das Bild vor einem Zugriff (ausführen einer Funktion) zu Testen:

>>> img.is_valid()
True
>>> img.delete()
True
>>> img.is_valid()
False

Ein Aufruf von img.delete() liefert bei einem in einem Fenster angezeigten Bild False, d. h. das Bild kann nicht gelöscht werden!

Bild speichern - schnell und einfach

Im Modul Gimp gibt es zum Speichern eines Bildes die Funktion file_save(). Diese erkennt anhand der Extension des Dateinamens den Typ und speichert es mit Standardeinstellungen für diesen Typ:

out = Gio.File.new_for_path('test.jpg')
res = Gimp.file_save(Gimp.RunMode.NONINTERACTIVE, img, out)
res = Gimp.file_save(Gimp.RunMode.INTERACTIVE, img, out)

Die letzten zwei Zeilen sind absichtlich angegeben weil der Aufruf der Funktion file_save() unterschiedliche Ergebnisse liefert.

NONINTERACTIVE speichert wie beschrieben das Bild mit Standardeinstellungen.

Wird in einem Script an dieser Stelle Gimp.RunMode.INTERACTIVE verwendet zeigt sich der Einstellungsdialog für den gewählten Dateityp, so als ob das Bild mit File > Export... aus dem Menu gespeichert wird.

Bild speichern - Volle Kontrolle

Wer mehr Einfluss auf die Parameter beim Speichern eines Bildes nehmen möchte kann wie folgt vorgehen. Die Nutzung der Funktion file-jpeg-export aus PDB stellt die etwas aufwendigeren Variante ein Bild zu speichern stellt dar. Die Parameter der Funktion müssen in einer Konfigurationsvariablen angegeben werden.

pdb = Gimp.get_pdb()
export_proc = pdb.lookup_procedure("file-jpeg-export")

gfile = Gio.File.new_for_path('test.jpg')

config = export_proc.create_config()
config.set_property("run-mode", Gimp.RunMode.NONINTERACTIVE)
config.set_property("image", img)
config.set_property("file", gfile)
config.set_property("options", None)
config.set_property("quality", 0.72)
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")

Die Parameter und die nötigen Werte sollten alle selbsterklärend sein oder können in der Hilfe (Menu Help > Procedure Browser > jpeg-export) nachgelesen werden.

Ausnahmen bilden sub-sampling und dct. Ein Blick in den Quelltext von Gimp (plug-ins/file-jpeg/jpeg.c) liefert die zulässigen Werte mit den im Export-dialog angezeigten Texten:

sub-sampling:
Parameter            Beschreibung im Export-Dialog
"sub-sampling-1x1" - "4:4:4 (best quality)"
"sub-sampling-2x1" - "4:2:2 (chroma halved horizontally)"
"sub-sampling-1x2" - "4:4:0 (chroma halved vertically)"
"sub-sampling-2x2" - "4:2:0 (chroma quartered)")
dct
"fixed"   - "Fast Integer"
"integer" - "Integer"
"float"   - "Floating-Point"

Ausgeführt wird die Funktion mit der Methode run(). Sie erhält die gerade erstellte Konfiguration als Parameter:

result = export_proc.run(config)
result.index(0)

Der Wert Gimp.PDBStatusType.SUCCESS im Rückgabewert zeigt ein erfolgreiches Speichern an.

zum Seitenanfang

Bild anzeigen

Die Funktion file_load() lädt das Bild nur in den Speicher. Für beide Modi (INTERACTIVE/NONINTERACTIVE) gilt: Das Bild wird geladen aber nicht angezeigt. Die Anzeige erfolgt erst mit dem Aufruf einer weiteren Funktion:

newdisp = Gimp.Display.new(img)

Dies ist zur Bearbeitung nicht nötig.

Angezeigtes Bild löschen

Ein Anzeigefenster kann mit der Funktion delete() gelöscht werden. Dieser Aufruf entfernt auch gleich das Bild aus dem Speicher.

newdisp.delete()

Weitere Aktionen auf das Bild (Variable img) liefern dann einen Fehler.

zum Seitenanfang

Trubleshooting

Ein paar Hinweise um Fehler einzugrenzen.

Wo bin ich? Pfad der Konsole

Das aktuelle Verzeichnis in der Konsole, das Arbeitsverzeichnis, kann schnell ermittelt werden, falls der Import des Bildes nicht funktioniert:

import os
os.getcwd()

Probleme beim Laden eines Bildes lassen sich durch Angabe eines absoluten Pfades umgehen, z. B. /home/user/Downloads/mein_bild.jpg.

Die Alternative ist ein Wechsel des Verzeichnis mit der Python-Funktion chdir() aus dem Modul os:

os.chdir('Downloads')

zum Seitenanfang

EXIF, IPTC... Metadaten

Geladene Bilder enthalten eventuell Kameradaten und weitere Informationen die nicht unbedingt im exportierten Bild enthalten sein sollen.

Die schlechte Nachricht:

Gimp speichert diese Informationen abhängig von dem Vorhandensein im Originalbild. Ich habe noch keinen Weg gefunden dies dynamisch zu beeinflussen.

In Python-Fu lässt sich nur ein leerer Satz Metadaten erzeugen und in dem Bild speichern.

img.set_metadata(Gimp.Metadata())

Darin sind dann immer noch der Erstellungszeitpunkt und einige weitere Daten enthalten.

Die gute Nachricht:

In den Einstellungen von Gimp kann die Speicherung von Metadaten unterbunden werden:

You can set defaults to enable or disable exporting metadata in
all affected file formats on whether you want complete privacy or not.
Settings are available in Edit/Preferences/Image Import and 
Export/Export Policies.

zum Seitenanfang

Letzte Aktualisierung: 2025-02