Bilddateien mit Python öffnen

Im letzten Blogbeitrag wurde gezeigt, wie Textdateien mit Python gelesen und geschrieben werden können. Geht es um Bilddateien gibt es eine besondere Bibliothek: Pillow. Sie ermöglicht nicht nur das Öffnen und Speichern von Bilddateien, sondern stellt auch Werkzeuge für die Bildmanipulation zur Verfügung. In diesem Artikel werfen wir aber lediglich einen Blick auf das Öffnen, das Speichern und die Verwendung einer Ausnahmebehandlung.

Beginnen wir mit dem Öffnen einer Bilddatei, wobei sich in diesem Beispiel die JPEG-Datei auf dem Desktop befindet. Damit folgendes Beispiel funktioniert, muss zunächst Pillow installiert werden:

$ pip3 install Pillow   # Linux, macOS
PS> pip install Pillow  # Windows

Bilddatei öffnen

Der Code zum Öffnen der JPEG-Datei so aus:

#!/usr/bin/env python3

from PIL import Image

FILE = "/Users/bodo/Desktop/R0000698.jpg"

with Image.open(FILE) as img:
    img.load()
    img.show()

Zum Öffnen der Bilddatei wird hier with zusammen mit Image.open() verwendet. Die Verwendung von with() hat den Vorteil, dass die Datei automatisch wieder geschlossen wird.

Die Methode load() lädt die Datei in den Speicher; die Methode show() zeigt die Datei an, wobei der standardmäßig eingerichtete Bildbetrachter gestartet wird. Auf einem Mac ist dies das Programm „Vorschau“, auf einem Windows-11-System öffnet sich die „Windows-Fotoanzeige“.

Windows-Fotoanzeige
Windows-Fotoanzeige (in Windows 11)

Auf meinem Rechner wird das Öffnen des Bildes problemlos funktionieren. Besser wäre es selbstverständlich, wenn dieser Code (plattformübergreifend) auf verschiedenen Systemen eingesetzt werden könnte. Dafür könnte z.B. expanduser verwendet werden, das zunächst importiert werden muss:

from os.path import expanduser

Anschließend könnte dann der Pfad zur Bilddatei wie folgt erstellt werden:

DIRECTORY = expanduser("~") + "/Desktop"
FILENAME = "R0000698.jpg"

image_file = "/".join([DIRECTORY, FILENAME])

An die Methode open() wird jetzt „image_file“ als Argument übergeben:

with Image.open(image_file) as img:

Der komplette Code sieht jetzt folgendermaßen aus:

#!/usr/bin/env python3

from PIL import Image
from os.path import expanduser

DIRECTORY = expanduser("~") + "/Desktop"
FILENAME = "R0000698.jpg"

image_file = "/".join([DIRECTORY, FILENAME])

with Image.open(image_file) as img:
    img.load()
    img.show()

Bilddatei speichern

Das Speichern einer Bilddatei ist genauso einfach. Im folgenden Beispiel wird das Bild unter Verwendung der Methode save() im Verzeichnis „Pictures“ gespeichert.

#!/usr/bin/env python3

from PIL import Image
from os.path import expanduser

DIRECTORY = expanduser("~") + "/Desktop"
DESTINATION_DIRECTORY = expanduser("~") + "/Pictures"
FILENAME = "R0000698.jpg"

image_file = "/".join([DIRECTORY, FILENAME])

with Image.open(image_file) as img:
    img.load()

    saved_file = "/".join([DESTINATION_DIRECTORY, FILENAME])
    img.save(saved_file)

Ausnahmebehandlung hinzufügen

Sollte eine zu öffnende Bilddatei nicht vorhanden sein, wird dies mit einem Traceback quittiert:

Traceback (most recent call last):
  File "/Users/bodo/Documents/dev/Python/images.py", line 12, in <module>
    with Image.open(image_file) as img:
         ^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/bodo/Documents/dev/Python/.venv/lib/python3.12/site-packages/PIL/Image.py", line 3243, in open
    fp = builtins.open(filename, "rb")
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
FileNotFoundError: [Errno 2] No such file or directory: '/Users/bodo/Desktop/R0000699.jpg'

Um so einem FileNotFoundError vorzubeugen, bietet es sich an, eine Ausnahmebehandlung hinzuzufügen:

#!/usr/bin/env python3

from PIL import Image
from os.path import expanduser

DIRECTORY = expanduser("~") + "/Desktop"
DESTINATION_DIRECTORY = expanduser("~") + "/Pictures"
FILENAME = "R0000699.jpg"

image_file = "/".join([DIRECTORY, FILENAME])

try:
    with Image.open(image_file) as img:
        img.load()
        img.show()

        saved_file = "/".join([DESTINATION_DIRECTORY, FILENAME])
        img.save(saved_file)
except FileNotFoundError as ex:
    print(ex)

Sollte eine Datei nicht vorhanden sein, erhält man nun lediglich eine aussagekräftige Fehlermeldung:

No such file or directory: '/Users/bodo/Desktop/R0000699.jpg'