Wie man benutzerdefinierte EXIF-Daten zu einem Matplotlib-Plot mit PIL/Pillow hinzufügt

Das folgende Skript ist ein Beispiel, wie man PIL/Pillow verwendet, um benutzerdefinierte EXIF-Daten zu einem Matplotlib-Plot hinzuzufügen, der als PNG exportiert wurde.

Die Zwischen-IO wird über ein BytesIO abgewickelt, um das Schreiben temporärer Dateien zu vermeiden.

add_exif.py
import numpy as np
import matplotlib.pyplot as plt
from io import BytesIO
from PIL import Image

# Schritt 1: Sinusfunktion mit Matplotlib plotten
x = np.linspace(0, 2 * np.pi, 100)
y = np.sin(x)

plt.figure()
plt.plot(x, y)
plt.title('Sine Function')
plt.xlabel('x')
plt.ylabel('sin(x)')

# Schritt 2: Plot in ein BytesIO-Objekt speichern
buf = BytesIO()
plt.savefig(buf, format='png')
plt.close()

# Schritt 3: Benutzerdefinierte EXIF-Daten zur PNG-Datei hinzufügen
buf.seek(0)
image = Image.open(buf)

# Bild in RGB konvertieren (EXIF-Daten werden auf 'P'-Modus-Bildern nicht unterstützt)
image = image.convert('RGB')

# Dictionary zum Halten der EXIF-Daten erstellen
exif_dict = {
    0x9003: '2024:08:04 12:00:00',  # DateTimeOriginal
    0x010E: 'Sine Wave Plot',        # ImageDescription
    0x0131: 'Matplotlib',            # Software
}

# EXIF-Dictionary in Bytes konvertieren
exif_bytes = Image.Exif()
for tag, value in exif_dict.items():
    exif_bytes[tag] = value

# Schritt 4: Modifiziertes Bild mit EXIF-Daten in ein neues BytesIO-Objekt speichern
output_buf = BytesIO()
image.save(output_buf, format='png', exif=exif_bytes)
output_buf.seek(0)

# Optional: Bild zur Überprüfung in eine Datei speichern
with open('sine_plot_with_exif.png', 'wb') as f:
    f.write(output_buf.getvalue())

Resultierender Plot

sin()-Plot mit benutzerdefinierten EXIF-Daten

Wie man die resultierenden EXIF-Daten ausgibt

Sie können jedes EXIF-Tool zum Lesen der Daten verwenden, wie z. B. exiftool:

exiftool_read.sh
exiftool sine_plot_with_exif.png

Beispielausgabe:

exiftool_output.txt
ExifTool Version Number         : 12.40
File Name                       : sine_plot_with_exif.png
File Size                       : 12345 bytes
File Modification Date/Time     : 2024:08:04 12:00:00+00:00
...
Image Description               : Sine Wave Plot
Date/Time Original              : 2024:08:04 12:00:00
Software                        : Matplotlib
...

Check out similar posts by category: Python, MatPlotLib