Viele Webanwendungen und Webdienste verwenden heutzutage EXIF-Daten in Bildern, um diese entsprechend zu verarbeiten. Das Extrahieren der EXIF-Daten aus einem Bild ist jedoch keine einfache Aufgabe und es gibt viele Formate und Datensätze, mit denen man umgehen muss. In diesem Blog werden einige der am häufigsten verwendeten Methoden vorgestellt, wie man mit Python EXIF-Daten aus einem Bild extrahieren kann.

Was sind EXIF-Daten?

EXIF-Daten sind eine Form von Metadaten, die in viele digitale Bilder eingebettet sind. Sie enthalten eine Vielzahl von Informationen über das Bild, z. B. das Datum und die Uhrzeit der Aufnahme, die verwendeten Kameraeinstellungen und die GPS-Koordinaten des Aufnahmeortes. Diese Informationen können sehr nützlich sein, wenn man versucht, die Quelle eines Bildes ausfindig zu machen oder den Kontext, in dem es aufgenommen wurde, zu bestimmen.

Methode 1: Verwendung der pil-Bibliothek

Voraussetzungen:

PIL: Die Pil-Bibliothek ist eine Python-Bibliothek, die es dem Benutzer ermöglicht, Bilder zu erstellen, zu manipulieren und zu konvertieren. Die Bibliothek basiert auf der Pillow-Bibliothek und bietet eine Reihe von Bildverarbeitungs- und -manipulationsfunktionen. Die Bibliothek ist in C geschrieben und ist für Windows, Linux und macOS verfügbar.

pip install pil

Code:

Importieren Sie alle Abhängigkeiten

from PIL import Image
from PIL.ExifTags import TAGS

Hier fügen wir den Pfad des Bildes hinzu und öffnen dann das Bild mit pil.

Hinweis: Diese Methode funktioniert nur bei jpg-Dateien, also verwenden Sie nur diese.

imagename = 'photo2.jpg'
image = Image.open(imagename)

Bevor wir die EXIF-Daten eines Bildes übernehmen, sollten wir zunächst versuchen, etwas über das Bild zu erfahren. Zu diesem Zweck können wir die Kissenbibliothek verwenden, um einige Attribute des Bildobjekts zu ermitteln. Lassen Sie uns diese zunächst ausdrucken.

# getting the basic metadata from the image
info_dict = {
    "Filename": image.filename,
    "Image Size": image.size,
    "Image Height": image.height,
    "Image Width": image.width,
    "Image Format": image.format,
    "Image Mode": image.mode,
    "Image is Animated": getattr(image, "is_animated", False),
    "Frames in Image": getattr(image, "n_frames", 1)
}

for label,value in info_dict.items():
    print(f"{label:25}: {value}")

Ausgabe:

Nun wollen wir mit Python und der Funktion getexif() die EXIF-Daten aus einem Bild extrahieren.

 exifdata = image.getexif()

Das Problem besteht darin, dass die EXIF-Datenvariable nur Feldnamen als Ganzzahlen zurückgibt und keine für Menschen lesbaren Werte. Wir müssen die Daten in unserer Bilddatentabelle verwenden, um die richtigen Feldnamen für unser Projekt zu erhalten.

# iterating over all EXIF data fields
for tag_id in exifdata:
    tag = TAGS.get(tag_id, tag_id)
    data = exifdata.get(tag_id)
    # decode bytes
    if isinstance(data, bytes):
        data = data.decode()
    print(f"{tag:25}: {data}")

Ausgabe:

Hier sehen Sie eine Liste mit Informationen über das Bild, wie z. B. das Modell, die Software, Datum und Uhrzeit der Aufnahme, usw.

Methode 2: Verwendung der EXIF-Bibliothek

Voraussetzungen:

EXIF: Die EXIF-Bibliothek für Python ist ein großartiges Werkzeug zum Extrahieren von EXIF-Daten aus einem Bild mit Python. Mit dieser Bibliothek können Sie ganz einfach auf alle Metadaten zugreifen, die mit einem Foto verbunden sind, einschließlich Datum und Uhrzeit der Aufnahme, die verwendeten Kameraeinstellungen und den Standort des Fotos. Diese Informationen können sehr nützlich sein, wenn Sie versuchen, Ihre digitalen Fotos zu organisieren und zu verwalten. Um die EXIF-Bibliothek zu installieren, verwenden Sie den folgenden Befehl:

pip install exif

Code:

Öffnen wir zunächst das Bild in der EXIF-Bibliothek

from exif import Image

img_path = 'random2.jpg'
with open(img_path, 'rb') as src:
    img = Image(src)
    print (src.name, img)

Ausgabe:

Nachdem wir nun unser Bild geladen haben, wollen wir sehen, welche EXIF-Daten unser Bild enthält.

print(img.list_all())

Ausgabe:

Wie Sie sehen können, gibt es viele EXIF-Daten in dem jeweiligen Bild. Lassen Sie uns zum Beispiel das Datum und die Uhrzeit des Bildes mit der Get-Methode extrahieren.

print(f' Date and Time: {img.get("datetime")}')

Ausgabe:

Extrahieren Sie den Speicherort des Bildes:

Um den Standort des Bildes zu extrahieren, müssen wir zunächst den Längen- und Breitengrad sowie die Referenz des Bildes ermitteln.

from exif import Image

img_path = 'random2.jpg'
with open(img_path, 'rb') as src:
    img = Image(src)

# getting the Longitude and latitude data
print(f' Longitude data: {img.get("gps_longitude")}')
print(f' latitude data: {img.get("gps_latitude")}')
# getting the Longitude  and latitude Reference data is also very important when converting the Decimal degrees formen
print(f' Longitude data reference : {img.get("gps_longitude_ref")}')
print(f' latitude data reference : {img.get("gps_latitude_ref")}')

Ausgabe:

Diese Daten liegen derzeit im Format Grad, Minuten und Sekunden (DMS) vor, so dass wir die Daten in das Format Dezimalgrad (DD) konvertieren müssen.

from exif import Image

img_path = 'random2.jpg'
with open(img_path, 'rb') as src:
    img = Image(src)

def decimal_coords(coords, ref):
    decimal_degrees = coords[0] + \
                      coords[1] / 60 + \
                      coords[2] / 3600
    if ref == "S" or ref == "W":
        decimal_degrees = -decimal_degrees 
    return decimal_degrees

def image_coordinates(image_path):
    with open(img_path, 'rb') as src:
        img = Image(src)
    if img.has_exif:
        try:
            img.gps_longitude
            coords = (decimal_coords(img.gps_latitude,
                      img.gps_latitude_ref),
                      decimal_coords(img.gps_longitude,
                      img.gps_longitude_ref))
        except AttributeError:
            print('No Coordinates')
    else:
        print('The Image has no EXIF information')
    print(f"Image {src.name}, OS Version:{img.get('software', 'Not Known')} ------")
    print(f"Was taken: {img.datetime_original}, and has coordinates:{coords}")

image_coordinates(img_path)

Schauen wir uns die Erklärung des Codes an:

  1. Importieren Sie die Abhängigkeit
  2. Laden des Bildes in das EXIF-Modul
  3. Es wurde eine Funktion zur Konvertierung der Koordinaten in das Format Dezimalgrad (DD) erstellt.
  4. Dann erstellte ich eine weitere Funktion, um die Koordinaten im Format Dezimalgrad (DD) mit einigen zusätzlichen Metadaten des Bildes auszudrucken.

Ausgabe:

Das war’s. Jetzt haben wir unsere Koordinaten im Dezimalgradformat, und wenn Sie sie verwenden möchten, kopieren Sie sie einfach und fügen sie in Google Maps ein.

Letzte Worte

In diesem Blogbeitrag haben wir zwei verschiedene Methoden zum Extrahieren von EXIF-Daten untersucht. Die erste Methode ist die Verwendung der Python Imaging Library. Sie ist ein großartiges Werkzeug, kann aber nur bestimmte Arten von Informationen extrahieren. Die zweite Methode war die Verwendung der EXIF-Bibliothek, die ziemlich fortschrittlich ist und im Vergleich zur Pil-Bibliothek viel mehr Optionen bietet. Die EXIF-Bibliotheksdaten enthalten auch die Standortkoordinaten des Bildes, was für jede Art von Geoanalyse oder einfach für die Zuordnung des Aufnahmeortes von großem Nutzen ist. Ich hoffe, der Blog hat Ihnen gefallen. Wenn Sie weitere Fragen haben, zögern Sie bitte nicht, uns zu kontaktieren. Vielen Dank für die Lektüre!