Künstliche Intelligenz: Wie ich zusammen mit GPT-4 ein Programm entwickelte

Man kann gar nicht genug darauf hinweisen, dass dieses Jahr vermutlich der Beginn einer neuen Zeitrechnung ist. Ich versuche, mich möglichst schnell darauf einzustellen. Dazu gehört der tägliche Einsatz von Chat-GPT in der Variante GPT-4 und die Programmierung der von OpenAI zur Verfügung gestellten API.
Nach einigen kleineren Tests damit begann ich, viel mit einer lokalen Installation von Stable Diffusion zu experimentieren. Meine Bilder wollte ich auf devianart.com veröffentlichen. Ich hatte Stable Diffusion aber so eingestellt, dass es in jedem erzeugten Bild im EXIF-Bereich alle Daten ablegt, die zu seiner Erzeugung geführt haben.
Das lässt sich abschalten, ist aber von großer Bedeutung, wenn man später eines seiner Bilder sieht und wissen möchte, wie man das damals gemacht hat. Man möchte aber nicht, dass bei der Veröffentlichung eines Bildes die Betrachter die Möglichkeit haben, diese Informationen (unter anderem den Prompt) zu sehen.
Ich wollte diese Informationen also aus den zu veröffentlichenden Bildern entfernen. Im Internet bekam ich ein paar Hinweise auf Python-Programme, die den Job erledigen können. Das waren aber immer Kommandozeilenprogramme, die aus meiner Sicht umständlich waren. Also reifte bei mir der Gedanke, mir ein solches Programm selbst zu programmieren - und direkt darauf die Idee, es zusammen mit GPT-4 zu versuchen.
Ich öffnete also einen neuen Chat und wählte das GPT-4-Modell aus. Was ich genau schrieb und welche Antworten ich bekam, kann auf den folgenden Seiten im kompletten Chat-Verlauf nachgelesen werden. Der letzte dort gezeigte Code ist ein funktionierender Bildbrowser, der die Bilder eines beim Aufruf anzugebenden Verzeichnisses auf der linken Seite in vier Spalten zeigt. Es erlaubt, ein Bild anzuklicken, und zeigt es dann auf der rechten Seite groß mit seinen EXIF-Daten.
Ich habe das Programm in einer zweiten Sitzung nochmal überarbeitet. Aber dass ich dieses erste Programm, das mir jetzt hilft, eine konkrete Aufgabe zu erledigen, in etwa einer halben Stunde bauen konnte, hat mich beeindruckt.
Ich bin, was Python betrifft, ein Newbie und habe letztlich keine einzige Zeile Code vom "Prompt remover" geschrieben! Allerdings habe ich auf meinem Computer die Python-IDE Thonny(öffnet im neuen Fenster) installiert und bei jeder Antwort von GPT-4, in der Programmcode zurückgegeben wurde, diesen per Drag-and-drop nach Thonny kopiert und dort ausgeführt und getestet.
So konnte ich immer sofort sehen, was mir GPT-4 programmiert hat. Aus den Erkenntnissen daraus formulierte ich meine Antwort an GPT-4. Durch die Zusammenarbeit habe ich gelernt, dass es für Python unzählige Bibliotheken für alle möglichen Aufgaben gibt.
Nachfolgend das Protokoll meiner Zusammenarbeit mit GPT-4. Ich denke, alle Interessierten können davon lernen, wie so eine Zusammenarbeit tatsächlich stattfinden kann.
Protokoll meiner Zusammenarbeit mit GPT-4 - Teil 1
















python
from PIL import Image
import matplotlib.pyplot as plt
def display_image(image_path):
# Öffnen Sie das Bild und anzeigen Sie es
img = Image.open(image_path)
plt.imshow(img)
plt.show()
def remove_exif(image_path, output_path):
# Öffnen Sie das Bild
img = Image.open(image_path)
# Überprüfen, ob das Bild Exif-Daten enthält
if hasattr(img, '_getexif'):
exif_data = img._getexif()
if exif_data is not None:
print("Exif-Daten vor der Entfernung: ", exif_data)
# Entfernen Sie die Exif-Daten, indem Sie das Bild ohne diese speichern
data = list(img.getdata())
image_without_exif = Image.new(img.mode, img.size)
image_without_exif.putdata(data)
image_without_exif.save(output_path)
print(f"Bild ohne Exif-Daten gespeichert als {output_path}.")
# Pfad zur PNG-Datei
image_path = 'path_to_your_image.png'
# Anzeigen des Bildes
display_image(image_path)
# Entfernen der Exif-Daten und Speichern des Bildes
output_path = 'path_to_output_image.png'
remove_exif(image_path, output_path)
















python
import tkinter as tk
from tkinter import filedialog
from PIL import Image, ImageTk
class ImageBrowser:
def __init__(self, master):
self.master = master
self.master.title('Bildbrowser')
self.canvas = tk.Canvas(master)
self.canvas.pack()
self.browse_button = tk.Button(master, text='Bild öffnen', command=self.load_image)
self.browse_button.pack()
self.save_button = tk.Button(master, text='Exif entfernen und speichern', command=self.remove_exif_and_save)
self.save_button.pack()
self.image_path = None
self.image = None
def load_image(self):
self.image_path = filedialog.askopenfilename(filetypes=[('image files', '.png')])
# Bild mit PIL öffnen
self.image = Image.open(self.image_path)
# Das Bild muss für Tkinter konvertiert werden
tk_image = ImageTk.PhotoImage(self.image)
# Alles auf der Leinwand löschen und neues Bild zeichnen
self.canvas.delete('all')
self.canvas.create_image(0, 0, anchor='nw', image=tk_image)
self.canvas.image = tk_image
def remove_exif_and_save(self):
if self.image is not None:
# Überprüfen, ob das Bild Exif-Daten enthält
if hasattr(self.image, '_getexif'):
exif_data = self.image._getexif()
if exif_data is not None:
print("Exif-Daten vor der Entfernung: ", exif_data)
# Entfernen Sie die Exif-Daten, indem Sie das Bild ohne diese speichern
data = list(self.image.getdata())
image_without_exif = Image.new(self.image.mode, self.image.size)
image_without_exif.putdata(data)
# Speichern Sie das Bild ohne Exif-Daten
output_path = filedialog.asksaveasfilename(defaultextension=".png")
image_without_exif.save(output_path)
print(f"Bild ohne Exif-Daten gespeichert als {output_path}.")
root = tk.Tk()
app = ImageBrowser(root)
root.mainloop()
















python
import tkinter as tk
from tkinter import filedialog
from PIL import Image, ImageTk
class ImageBrowser:
def __init__(self, master):
self.master = master
self.master.title('Bildbrowser')
self.canvas = tk.Canvas(master)
self.canvas.pack()
self.browse_button = tk.Button(master, text='Bild öffnen', command=self.load_image)
self.browse_button.pack()
self.save_button = tk.Button(master, text='Exif entfernen und speichern', command=self.remove_exif_and_save)
self.save_button.pack()
self.image_path = None
self.image = None
# Pfad zum Startverzeichnis
self.initial_dir = '/path/to/your/directory'
def load_image(self):
self.image_path = filedialog.askopenfilename(initialdir=self.initial_dir, filetypes=[('image files', '.png')])
# Bild mit PIL öffnen
self.image = Image.open(self.image_path)
# Das Bild muss für Tkinter konvertiert werden
tk_image = ImageTk.PhotoImage(self.image)
# Alles auf der Leinwand löschen und neues Bild zeichnen
self.canvas.delete('all')
self.canvas.create_image(0, 0, anchor='nw', image=tk_image)
self.canvas.image = tk_image
def remove_exif_and_save(self):
if self.image is not None:
# Überprüfen, ob das Bild Exif-Daten enthält
if hasattr(self.image, '_getexif'):
exif_data = self.image._getexif()
if exif_data is not None:
print("Exif-Daten vor der Entfernung: ", exif_data)
# Entfernen Sie die Exif-Daten, indem Sie das Bild ohne diese speichern
data = list(self.image.getdata())
image_without_exif = Image.new(self.image.mode, self.image.size)
image_without_exif.putdata(data)
# Speichern Sie das Bild ohne Exif-Daten
output_path = filedialog.asksaveasfilename(initialdir=self.initial_dir, defaultextension=".png")
image_without_exif.save(output_path)
print(f"Bild ohne Exif-Daten gespeichert als {output_path}.")
root = tk.Tk()
app = ImageBrowser(root)
root.mainloop()
Protokoll meiner Zusammenarbeit mit GPT-4 - Teil 2
















python
import os
import tkinter as tk
from tkinter import filedialog
from PIL import Image, ImageTk
class ImageBrowser:
def __init__(self, master):
self.master = master
self.master.title('Bildbrowser')
self.master.geometry('1280x800')
self.scrollbar = tk.Scrollbar(master)
self.scrollbar.pack(side='right', fill='y')
self.canvas = tk.Canvas(master, yscrollcommand=self.scrollbar.set)
self.canvas.pack(side='left', fill='both', expand=True)
self.scrollbar.config(command=self.canvas.yview)
self.frame = tk.Frame(self.canvas)
self.canvas.create_window((0, 0), window=self.frame, anchor='nw')
self.browse_button = tk.Button(master, text='Verzeichnis öffnen', command=self.load_images)
self.browse_button.pack()
self.image_paths = []
self.images = []
# Pfad zum Startverzeichnis
self.initial_dir = '/path/to/your/directory'
def load_images(self):
self.initial_dir = filedialog.askdirectory(initialdir=self.initial_dir)
# Lösche alle vorhandenen Thumbnails
for widget in self.frame.winfo_children():
widget.destroy()
# Lade alle PNG-Bilder im ausgewählten Verzeichnis
for file in os.listdir(self.initial_dir):
if file.endswith('.png'):
image_path = os.path.join(self.initial_dir, file)
self.image_paths.append(image_path)
# Erzeuge ein Thumbnail des Bildes
image = Image.open(image_path)
image.thumbnail((128, 128)) # 128x128 Thumbnail
tk_image = ImageTk.PhotoImage(image)
# Zeige das Thumbnail in einem Button, der das Bild in voller Größe anzeigt, wenn es geklickt wird
button = tk.Button(self.frame, image=tk_image, command=lambda i=image_path: self.show_image(i))
button.image = tk_image # Referenz zum Tkinter-Bild halten, um Garbage Collection zu verhindern
button.pack()
# Aktualisiere den Scrollbereich der Leinwand
self.frame.update()
self.canvas.config(scrollregion=self.canvas.bbox('all'))
def show_image(self, image_path):
# Bild in voller Größe anzeigen
image = Image.open(image_path)
tk_image = ImageTk.PhotoImage(image)
# Alles auf der Leinwand löschen und neues Bild zeichnen
self.canvas.delete('all')
self.canvas.create_image(0, 0, anchor='nw', image=tk_image)
self.canvas.image = tk_image # Referenz zum Tkinter-Bild halten, um Garbage Collection zu verhindern
root = tk.Tk()
app = ImageBrowser(root)
root.mainloop()
















python
import os
import tkinter as tk
from tkinter import filedialog
from PIL import Image, ImageTk
class ImageBrowser:
def __init__(self, master):
self.master = master
self.master.title('Bildbrowser')
self.master.geometry('1280x800')
self.frame = tk.Frame(master)
self.frame.pack()
self.browse_button = tk.Button(self.frame, text='Verzeichnis öffnen', command=self.load_images)
self.browse_button.pack()
self.thumbnail_frame = tk.Frame(self.frame)
self.thumbnail_frame.pack(side='left', fill='both')
self.display_frame = tk.Frame(self.frame)
self.display_frame.pack(side='right', fill='both', expand=True)
self.canvas = tk.Canvas(self.display_frame)
self.canvas.pack(fill='both', expand=True)
self.image_paths = []
self.images = []
# Pfad zum Startverzeichnis
self.initial_dir = '/path/to/your/directory'
def load_images(self):
self.initial_dir = filedialog.askdirectory(initialdir=self.initial_dir)
# Lösche alle vorhandenen Thumbnails und das Anzeigebild
for widget in self.thumbnail_frame.winfo_children():
widget.destroy()
self.canvas.delete('all')
# Lade alle PNG-Bilder im ausgewählten Verzeichnis
for file in os.listdir(self.initial_dir):
if file.endswith('.png'):
image_path = os.path.join(self.initial_dir, file)
self.image_paths.append(image_path)
# Erzeuge ein Thumbnail des Bildes
image = Image.open(image_path)
image.thumbnail((128, 128)) # 128x128 Thumbnail
tk_image = ImageTk.PhotoImage(image)
# Zeige das Thumbnail in einem Button, der das Bild in voller Größe anzeigt, wenn es geklickt wird
button = tk.Button(self.thumbnail_frame, image=tk_image, command=lambda i=image_path: self.show_image(i))
button.image = tk_image # Referenz zum Tkinter-Bild halten, um Garbage Collection zu verhindern
button.pack(side='left')
def show_image(self, image_path):
# Bild in voller Größe anzeigen
image = Image.open(image_path)
tk_image = ImageTk.PhotoImage(image)
# Alles auf der Leinwand löschen und neues Bild zeichnen
self.canvas.delete('all')
self.canvas.create_image(0, 0, anchor='nw', image=tk_image)
self.canvas.image = tk_image # Referenz zum Tkinter-Bild halten, um Garbage Collection zu verhindern
root = tk.Tk()
app = ImageBrowser(root)
root.mainloop()
















python
import os
import tkinter as tk
from tkinter import filedialog
from PIL import Image, ImageTk
class ImageBrowser:
def __init__(self, master):
self.master = master
self.master.title('Bildbrowser')
self.master.geometry('1280x800')
self.frame = tk.Frame(master)
self.frame.pack()
self.browse_button = tk.Button(self.frame, text='Verzeichnis öffnen', command=self.load_images)
self.browse_button.pack()
self.thumbnail_frame = tk.Frame(self.frame)
self.thumbnail_frame.pack(side='left', fill='both')
self.display_frame = tk.Frame(self.frame)
self.display_frame.pack(side='right', fill='both', expand=True)
self.canvas = tk.Canvas(self.display_frame, width=800, height=600)
self.canvas.pack()
self.image_paths = []
# Pfad zum Startverzeichnis
self.initial_dir = '/path/to/your/directory'
def load_images(self):
self.initial_dir = filedialog.askdirectory(initialdir=self.initial_dir)
# Lösche alle vorhandenen Thumbnails und das Anzeigebild
for widget in self.thumbnail_frame.winfo_children():
widget.destroy()
self.canvas.delete('all')
row, column = 0, 0
# Lade alle PNG-Bilder im ausgewählten Verzeichnis
for file in os.listdir(self.initial_dir):
if file.endswith('.png'):
image_path = os.path.join(self.initial_dir, file)
self.image_paths.append(image_path)
# Erzeuge ein Thumbnail des Bildes
image = Image.open(image_path)
image.thumbnail((128, 128)) # 128x128 Thumbnail
tk_image = ImageTk.PhotoImage(image)
# Zeige das Thumbnail in einem Button, der das Bild in voller Größe anzeigt, wenn es geklickt wird
button = tk.Button(self.thumbnail_frame, image=tk_image, command=lambda i=image_path: self.show_image(i))
button.image = tk_image # Referenz zum Tkinter-Bild halten, um Garbage Collection zu verhindern
button.grid(row=row, column=column)
# Update column and row for next image
column += 1
if column > 3: # set the number of images per row
column = 0
row += 1
def show_image(self, image_path):
# Bild in voller Größe anzeigen
image = Image.open(image_path)
tk_image = ImageTk.PhotoImage(image)
# Alles auf der Leinwand löschen und neues Bild zeichnen
self.canvas.delete('all')
self.canvas.create_image(0, 0, anchor='nw', image=tk_image)
self.canvas.image = tk_image # Referenz zum Tkinter-Bild halten, um Garbage Collection zu verhindern
root = tk.Tk()
app = ImageBrowser(root)
root.mainloop()
Protokoll meiner Zusammenarbeit mit GPT-4 - Teil 3
















python
import os
import tkinter as tk
from tkinter import filedialog
from PIL import Image, ImageTk
class ImageBrowser:
def __init__(self, master):
self.master = master
self.master.title('Bildbrowser')
self.master.geometry('1280x800')
self.browse_button = tk.Button(master, text='Verzeichnis öffnen', command=self.load_images)
self.browse_button.pack()
self.thumbnail_canvas = tk.Canvas(master, width=480, height=800)
self.thumbnail_canvas.pack(side='left', fill='y', expand=True)
self.scrollbar = tk.Scrollbar(master, command=self.thumbnail_canvas.yview)
self.scrollbar.pack(side='left', fill='y')
self.thumbnail_canvas.configure(yscrollcommand=self.scrollbar.set)
self.thumbnail_frame = tk.Frame(self.thumbnail_canvas)
self.thumbnail_canvas.create_window((0, 0), window=self.thumbnail_frame, anchor='nw')
self.display_frame = tk.Frame(master)
self.display_frame.pack(side='right', fill='both', expand=True)
self.canvas = tk.Canvas(self.display_frame, width=800, height=800)
self.canvas.pack(fill='both', expand=True)
self.image_paths = []
# Pfad zum Startverzeichnis
self.initial_dir = '/path/to/your/directory'
self.thumbnail_frame.bind('<Configure>', lambda e: self.thumbnail_canvas.configure(scrollregion=self.thumbnail_canvas.bbox('all')))
def load_images(self):
self.initial_dir = filedialog.askdirectory(initialdir=self.initial_dir)
# Lösche alle vorhandenen Thumbnails und das Anzeigebild
for widget in self.thumbnail_frame.winfo_children():
widget.destroy()
self.canvas.delete('all')
row, column = 0, 0
# Lade alle PNG-Bilder im ausgewählten Verzeichnis
for file in os.listdir(self.initial_dir):
if file.endswith('.png'):
image_path = os.path.join(self.initial_dir, file)
self.image_paths.append(image_path)
# Erzeuge ein Thumbnail des Bildes
image = Image.open(image_path)
image.thumbnail((128, 128)) # 128x128 Thumbnail
tk_image = ImageTk.PhotoImage(image)
# Zeige das Thumbnail in einem Button, der das Bild in voller Größe anzeigt, wenn es geklickt wird
button = tk.Button(self.thumbnail_frame, image=tk_image, command=lambda i=image_path: self.show_image(i))
button.image = tk_image # Referenz zum Tkinter-Bild halten, um Garbage Collection zu verhindern
button.grid(row=row, column=column)
# Update column and row for next image
column += 1
if column > 3: # set the number of images per row
column = 0
row += 1
def show_image(self, image_path):
# Bild in voller Größe anzeigen
image = Image.open(image_path)
width, height = image.size
aspect_ratio = width / height
# Calculate new dimensions based on aspect ratio
new_width = self.canvas.winfo_width()
new_height = int(new_width / aspect_ratio)
if new_height > self.canvas.winfo_height():
new_height = self.canvas.winfo_height()
new_width = int(new_height * aspect_ratio)
# Resize image
image = image.resize((new_width, new_height), Image.ANTIALIAS)
tk_image = ImageTk.PhotoImage(image)
# Alles auf der Leinwand löschen und neues Bild zeichnen
self.canvas.delete('all')
self.canvas.create_image(0, 0, anchor='nw', image=tk_image)
self.canvas.image = tk_image # Referenz zum Tkinter-Bild halten, um Garbage Collection zu verhindern
root = tk.Tk()
app = ImageBrowser(root)
root.mainloop()
















python
import os
import tkinter as tk
from tkinter import filedialog
from PIL import Image, ImageTk, PngImagePlugin
class ImageBrowser:
def __init__(self, master):
self.master = master
self.master.title('Bildbrowser')
self.master.geometry('1280x800')
self.browse_button = tk.Button(master, text='Verzeichnis öffnen', command=self.load_images)
self.browse_button.pack(pady=10)
self.thumbnail_canvas = tk.Canvas(master, width=480, height=800)
self.thumbnail_canvas.pack(side='left', fill='y', expand=True, padx=10)
self.scrollbar = tk.Scrollbar(master, command=self.thumbnail_canvas.yview)
self.scrollbar.pack(side='left', fill='y')
self.thumbnail_canvas.configure(yscrollcommand=self.scrollbar.set)
self.thumbnail_frame = tk.Frame(self.thumbnail_canvas)
self.thumbnail_canvas.create_window((0, 0), window=self.thumbnail_frame, anchor='nw')
self.display_frame = tk.Frame(master)
self.display_frame.pack(side='right', fill='both', expand=True, padx=10)
self.canvas = tk.Canvas(self.display_frame, width=800, height=600)
self.canvas.pack(pady=10)
self.delete_exif_button = tk.Button(self.display_frame, text='EXIF-Daten löschen', command=self.delete_exif)
self.delete_exif_button.pack(side='left', padx=5)
self.save_exif_button = tk.Button(self.display_frame, text='EXIF-Daten speichern', command=self.save_exif)
self.save_exif_button.pack(side='left', padx=5)
self.image_paths = []
self.current_image_path = None
# Pfad zum Startverzeichnis
self.initial_dir = '/path/to/your/directory'
self.thumbnail_frame.bind('<Configure>', lambda e: self.thumbnail_canvas.configure(scrollregion=self.thumbnail_canvas.bbox('all')))
def load_images(self):
self.initial_dir = filedialog.askdirectory(initialdir=self.initial_dir)
# Lösche alle vorhandenen Thumbnails und das Anzeigebild
for widget in self.thumbnail_frame.winfo_children():
widget.destroy()
self.canvas.delete('all')
row, column = 0, 0
# Lade alle PNG-Bilder im ausgewählten Verzeichnis
for file in os.listdir(self.initial_dir):
if file.endswith('.png'):
image_path = os.path.join(self.initial_dir, file)
self.image_paths.append(image_path)
# Erzeuge ein Thumbnail des Bildes
image = Image.open(image_path)
image.thumbnail((128, 128)) # 128x128 Thumbnail
tk_image = ImageTk.PhotoImage(image)
# Zeige das Thumbnail in einem Button, der das Bild in voller Größe anzeigt, wenn es geklickt wird
button = tk.Button(self.thumbnail_frame, image=tk_image, command=lambda i=image_path: self.show_image(i))
button.image = tk_image # Referenz zum Tkinter-Bild halten, um Garbage Collection zu verhindern
button.grid(row=row, column=column)
# Update column and row for next image
column += 1
if column > 3: # set the number of images per row
column = 0
row += 1
def show_image(self, image_path):
# Bild in voller Größe anzeigen
self.current_image_path = image_path
image = Image.open(image_path)
width, height = image.size
aspect_ratio = width / height
# Calculate new dimensions based on aspect ratio
new_width = self.canvas.winfo_width()
new_height = int(new_width / aspect_ratio)
if new_height > self.canvas.winfo_height():
new_height = self.canvas.winfo_height()
new_width = int(new_height * aspect_ratio)
# Resize image
image = image.resize((new_width, new_height), Image.ANTIALIAS)
tk_image = ImageTk.PhotoImage(image)
# Alles auf der Leinwand löschen und neues Bild zeichnen
self.canvas.delete('all')
self.canvas.create_image(0, 0, anchor='nw', image=tk_image)
self.canvas.image = tk_image # Referenz zum Tkinter-Bild halten, um Garbage Collection zu verhindern
def delete_exif(self):
if self.current_image_path is not None:
image = Image.open(self.current_image_path)
pnginfo = PngImagePlugin.PngInfo()
# Lösche alle Textinformationen aus den PNG-Metadaten
for key in image.info.keys():
if key != 'transparency':
pnginfo.remove_text(key)
# Speichere das Bild ohne Textinformationen
image.save(self.current_image_path, "PNG", pnginfo=pnginfo)
print(f"Text-Metadaten aus {self.current_image_path} entfernt")
def save_exif(self):
if self.current_image_path is not None:
image = Image.open(self.current_image_path)
# Speichere alle Textinformationen aus den PNG-Metadaten
for key, value in image.info.items():
if key != 'transparency':
print(f"Schlüssel: {key}, Wert: {value}")
root = tk.Tk()
app = ImageBrowser(root)
root.mainloop()
















python
import os
import tkinter as tk
from tkinter import filedialog
from PIL import Image, ImageTk, PngImagePlugin
class ImageBrowser:
def __init__(self, master):
self.master = master
self.master.title('Bildbrowser')
self.master.geometry('1280x800')
self.browse_button = tk.Button(master, text='Verzeichnis öffnen', command=self.load_images)
self.browse_button.pack(pady=10)
self.thumbnail_canvas = tk.Canvas(master, width=480, height=800)
self.thumbnail_canvas.pack(side='left', fill='y', expand=True, padx=10, pady=10)
self.scrollbar = tk.Scrollbar(master, command=self.thumbnail_canvas.yview)
self.scrollbar.pack(side='left', fill='y')
self.thumbnail_canvas.configure(yscrollcommand=self.scrollbar.set)
self.thumbnail_frame = tk.Frame(self.thumbnail_canvas)
self.thumbnail_canvas.create_window((0, 0), window=self.thumbnail_frame, anchor='nw')
self.display_frame = tk.Frame(master)
self.display_frame.pack(side='right', fill='both', expand=True, padx=10)
self.canvas = tk.Canvas(self.display_frame, width=800, height=600)
self.canvas.pack(pady=10)
self.delete_exif_button = tk.Button(self.display_frame, text='EXIF-Daten löschen', command=self.delete_exif)
self.delete_exif_button.pack(side='left', padx=5)
self.save_exif_button = tk.Button(self.display_frame, text='EXIF-Daten speichern', command=self.save_exif)
self.save_exif_button.pack(side='left', padx=5)
self.image_paths = []
self.current_image_path = None
# Pfad zum Startverzeichnis
self.initial_dir = '/path/to/your/directory'
self.thumbnail_frame.bind('<Configure>', lambda e: self.thumbnail_canvas.configure(scrollregion=self.thumbnail_canvas.bbox('all')))
def load_images(self):
self.initial_dir = filedialog.askdirectory(initialdir=self.initial_dir)
# Lösche alle vorhandenen Thumbnails und das Anzeigebild
for widget in self.thumbnail_frame.winfo_children():
widget.destroy()
self.canvas.delete('all')
row, column = 0, 0
# Lade alle PNG-Bilder im ausgewählten Verzeichnis
for file in os.listdir(self.initial_dir):
if file.endswith('.png'):
image_path = os.path.join(self.initial_dir, file)
self.image_paths.append(image_path)
# Erzeuge ein Thumbnail des Bildes
image = Image.open(image_path)
image.thumbnail((128, 128)) # 128x128 Thumbnail
tk_image = ImageTk.PhotoImage(image)
# Zeige das Thumbnail in einem Button, der das Bild in voller Größe anzeigt, wenn es geklickt wird
button = tk.Button(self.thumbnail_frame, image=tk_image, command=lambda i=image_path: self.show_image(i))
button.image = tk_image # Referenz zum Tkinter-Bild halten, um Garbage Collection zu verhindern
button.grid(row=row, column=column)
# Update column and row for next image
column += 1
if column > 3: # set the number of images per row
column = 0
row += 1
def show_image(self, image_path):
# Bild in voller Größe anzeigen
self.current_image_path = image_path
image = Image.open(image_path)
width, height = image.size
aspect_ratio = width / height
# Calculate new dimensions based on aspect ratio
new_width = self.canvas.winfo_width()
new_height = int(new_width / aspect_ratio)
if new_height > self.canvas.winfo_height():
new_height = self.canvas.winfo_height()
new_width = int(new_height * aspect_ratio)
# Resize image
image = image.resize((new_width, new_height), Image.ANTIALIAS)
tk_image = ImageTk.PhotoImage(image)
# Alles auf der Leinwand löschen und neues Bild zeichnen
self.canvas.delete('all')
self.canvas.create_image(0, 0, anchor='nw', image=tk_image)
self.canvas.image = tk_image # Referenz zum Tkinter-Bild halten, um Garbage Collection zu verhindern
def delete_exif(self):
if self.current_image_path is not None:
image = Image.open(self.current_image_path)
pnginfo = PngImagePlugin.PngInfo()
# Setze alle Textinformationen auf leeren String
for key in image.info.keys():
if key != 'transparency':
pnginfo.add_text(key, '')
# Speichere das Bild ohne Textinformationen
image.save(self.current_image_path, "PNG", pnginfo=pnginfo)
print(f"Text-Metadaten aus {self.current_image_path} entfernt")
def save_exif(self):
if self.current_image_path is not None:
image = Image.open(self.current_image_path)
# Speichere alle Textinformationen aus den PNG-Metadaten
for key, value in image.info.items():
if key != 'transparency':
print(f"Schlüssel: {key}, Wert: {value}")
root = tk.Tk()
app = ImageBrowser(root)
root.mainloop()
Protokoll meiner Zusammenarbeit mit GPT-4 - Teil 4
















python
import os
import tkinter as tk
from tkinter import filedialog
from PIL import Image, ImageTk, PngImagePlugin
class ImageBrowser:
def __init__(self, master):
self.master = master
self.master.title('Bildbrowser')
self.master.geometry('1280x800')
self.browse_button = tk.Button(master, text='Verzeichnis öffnen', command=self.load_images)
self.browse_button.pack(pady=10)
self.thumbnail_canvas = tk.Canvas(master, width=480, height=800)
self.thumbnail_canvas.pack(side='left', fill='y', expand=True, padx=10, pady=10)
self.scrollbar = tk.Scrollbar(master, command=self.thumbnail_canvas.yview)
self.scrollbar.pack(side='left', fill='y')
self.thumbnail_canvas.configure(yscrollcommand=self.scrollbar.set)
self.thumbnail_frame = tk.Frame(self.thumbnail_canvas)
self.thumbnail_canvas.create_window((0, 0), window=self.thumbnail_frame, anchor='nw')
self.display_frame = tk.Frame(master)
self.display_frame.pack(side='right', fill='both', expand=True, padx=10)
self.canvas = tk.Canvas(self.display_frame, width=800, height=600)
self.canvas.pack(pady=10)
self.delete_exif_button = tk.Button(self.display_frame, text='EXIF-Daten löschen', command=self.delete_exif)
self.delete_exif_button.pack(side='left', padx=5)
self.save_exif_button = tk.Button(self.display_frame, text='EXIF-Daten speichern', command=self.save_exif)
self.save_exif_button.pack(side='left', padx=5)
self.image_paths = []
self.current_image_path = None
# Pfad zum Startverzeichnis
self.initial_dir = '/path/to/your/directory'
self.thumbnail_frame.bind('<Configure>', lambda e: self.thumbnail_canvas.configure(scrollregion=self.thumbnail_canvas.bbox('all')))
self.canvas.bind('<Configure>', self.show_image_resized)
def load_images(self):
self.initial_dir = filedialog.askdirectory(initialdir=self.initial_dir)
# Lösche alle vorhandenen Thumbnails und das Anzeigebild
for widget in self.thumbnail_frame.winfo_children():
widget.destroy()
self.canvas.delete('all')
row, column = 0, 0
# Lade alle PNG-Bilder im ausgewählten Verzeichnis
for file in os.listdir(self.initial_dir):
if file.endswith('.png'):
image_path = os.path.join(self.initial_dir, file)
self.image_paths.append(image_path)
# Erzeuge ein Thumbnail des Bildes
image = Image.open(image_path)
image.thumbnail((128, 128)) # 128x128 Thumbnail
tk_image = ImageTk.PhotoImage(image)
# Zeige das Thumbnail in einem Button, der das Bild in voller Größe anzeigt, wenn es geklickt wird
button = tk.Button(self.thumbnail_frame, image=tk_image, text=file, command=lambda i=image_path: self.show_image(i))
button.image = tk_image # Referenz zum Tkinter-Bild halten, um Garbage Collection zu verhindern
button.grid(row=row, column=column)
# Update column and row for next image
column += 1
if column > 3: # set the number of images per row
column = 0
row += 1
def show_image(self, image_path):
# Bild in voller Größe anzeigen
self.current_image_path = image_path
self.show_image_resized()
def show_image_resized(self, event=None):
if self.current_image_path is not None:
# Bild in voller Größe anzeigen
image = Image.open(self.current_image_path)
width, height = image.size
aspect_ratio = width / height
# Calculate new dimensions based on aspect ratio
new_width = self.canvas.winfo_width()
new_height = int(new_width / aspect_ratio)
if new_height > self.canvas.winfo_height():
new_height = self.canvas.winfo_height()
new_width = int(new_height * aspect_ratio)
# Resize image
image = image.resize((new_width, new_height), Image.ANTIALIAS)
tk_image = ImageTk.PhotoImage(image)
# Alles auf der Leinwand löschen und neues Bild zeichnen
self.canvas.delete('all')
self.canvas.create_image(0, 0, anchor='nw', image=tk_image)
self.canvas.image = tk_image # Referenz zum Tkinter-Bild halten, um Garbage Collection zu verhindern
def delete_exif(self):
if self.current_image_path is not None:
image = Image.open(self.current_image_path)
pnginfo = PngImagePlugin.PngInfo()
# Setze alle Textinformationen auf leeren String
for key in image.info.keys():
if key != 'transparency':
pnginfo.add_text(key, '')
# Speichere das Bild ohne Textinformationen
image.save(self.current_image_path, "PNG", pnginfo=pnginfo)
print(f"Text-Metadaten aus {self.current_image_path} entfernt")
def save_exif(self):
if self.current_image_path is not None:
image = Image.open(self.current_image_path)
# Speichere alle Textinformationen aus den PNG-Metadaten
for key, value in image.info.items():
if key != 'transparency':
print(f"Schlüssel: {key}, Wert: {value}")
image.save(self.current_image_path, "PNG") # Speichere das Bild, nachdem die Informationen ausgegeben wurden
print(f"EXIF-Daten für {self.current_image_path} gespeichert")
root = tk.Tk()
app = ImageBrowser(root)
root.mainloop()
















python
import os
import tkinter as tk
from tkinter import filedialog
from PIL import Image, ImageTk, PngImagePlugin
class ImageBrowser:
def __init__(self, master):
self.master = master
self.master.title('Bildbrowser')
self.master.geometry('1280x800')
self.browse_button = tk.Button(master, text='Verzeichnis öffnen', command=self.load_images)
self.browse_button.pack(pady=10)
self.thumbnail_canvas = tk.Canvas(master, width=480, height=800)
self.thumbnail_canvas.pack(side='left', fill='y', expand=True, padx=10, pady=10)
self.scrollbar = tk.Scrollbar(master, command=self.thumbnail_canvas.yview)
self.scrollbar.pack(side='left', fill='y')
self.thumbnail_canvas.configure(yscrollcommand=self.scrollbar.set)
self.thumbnail_frame = tk.Frame(self.thumbnail_canvas)
self.thumbnail_canvas.create_window((0, 0), window=self.thumbnail_frame, anchor='nw')
self.display_frame = tk.Frame(master)
self.display_frame.pack(side='right', fill='both', expand=True, padx=10)
self.canvas = tk.Canvas(self.display_frame, width=800, height=600)
self.canvas.pack(pady=10)
self.exif_label = tk.Label(self.display_frame, text='')
self.exif_label.pack()
self.delete_exif_button = tk.Button(self.display_frame, text='EXIF-Daten löschen', command=self.delete_exif)
self.delete_exif_button.pack(side='left', padx=5)
self.save_exif_button = tk.Button(self.display_frame, text='EXIF-Daten speichern', command=self.save_exif)
self.save_exif_button.pack(side='left', padx=5)
self.image_paths = []
self.current_image_path = None
# Pfad zum Startverzeichnis
self.initial_dir = '/path/to/your/directory'
self.thumbnail_frame.bind('<Configure>', lambda e: self.thumbnail_canvas.configure(scrollregion=self.thumbnail_canvas.bbox('all')))
self.canvas.bind('<Configure>', self.show_image_resized)
def load_images(self):
self.initial_dir = filedialog.askdirectory(initialdir=self.initial_dir)
# Lösche alle vorhandenen Thumbnails und das Anzeigebild
for widget in self.thumbnail_frame.winfo_children():
widget.destroy()
self.canvas.delete('all')
row, column = 0, 0
# Lade alle PNG-Bilder im ausgewählten Verzeichnis
for file in os.listdir(self.initial_dir):
if file.endswith('.png'):
image_path = os.path.join(self.initial_dir, file)
self.image_paths.append(image_path)
# Erzeuge ein Thumbnail des Bildes
image = Image.open(image_path)
image.thumbnail((128, 128)) # 128x128 Thumbnail
tk_image = ImageTk.PhotoImage(image)
# Zeige das Thumbnail in einem Button, der das Bild in voller Größe anzeigt, wenn es geklickt wird
button = tk.Button(self.thumbnail_frame, image=tk_image, text=file, compound='top', command=lambda i=image_path: self.show_image(i))
button.image = tk_image # Referenz zum Tkinter-Bild halten, um Garbage Collection zu verhindern
button.grid(row=row, column=column)
# Update column and row for next image
column += 1
if column > 3: # set the number of images per row
column = 0
row += 1
def show_image(self, image_path):
# Bild in voller Größe anzeigen
self.current_image_path = image_path
self.show_image_resized()
def show_image_resized(self, event=None):
if self.current_image_path is not None:
# Bild in voller Größe anzeigen
image = Image.open(self.current_image_path)
width, height = image.size
aspect_ratio = width / height
# Calculate new dimensions based on aspect ratio
new_width = self.canvas.winfo_width()
new_height = int(new_width / aspect_ratio)
if new_height > self.canvas.winfo_height():
new_height = self.canvas.winfo_height()
new_width = int(new_height * aspect_ratio)
# Resize image
image = image.resize((new_width, new_height), Image.ANTIALIAS)
tk_image = ImageTk.PhotoImage(image)
# Alles auf der Leinwand löschen und neues Bild zeichnen
self.canvas.delete('all')
self.canvas.create_image(0, 0, anchor='nw', image=tk_image)
self.canvas.image = tk_image # Referenz zum Tkinter-Bild halten, um Garbage Collection zu verhindern
# Update EXIF-Daten Anzeige
self.update_exif_display(image)
def update_exif_display(self, image):
exif_data = image.info
exif_text = '\n'.join(f'{key}: {value}' for key, value in exif_data.items() if key != 'transparency')
self.exif_label['text'] = exif_text
def delete_exif(self):
if self.current_image_path is not None:
image = Image.open(self.current_image_path)
pnginfo = PngImagePlugin.PngInfo()
# Setze alle Textinformationen auf leeren String
for key in image.info.keys():
if key != 'transparency':
pnginfo.add_text(key, '')
# Speichere das Bild ohne Textinformationen
image.save(self.current_image_path, "PNG", pnginfo=pnginfo)
print(f"Text-Metadaten aus {self.current_image_path} entfernt")
# Update EXIF-Daten Anzeige
self.update_exif_display(image)
def save_exif(self):
if self.current_image_path is not None:
image = Image.open(self.current_image_path)
# Speichere alle Textinformationen aus den PNG-Metadaten
for key, value in image.info.items():
if key != 'transparency':
print(f"Schlüssel: {key}, Wert: {value}")
image.save(self.current_image_path, "PNG") # Speichere das Bild, nachdem die Informationen ausgegeben wurden
print(f"EXIF-Daten für {self.current_image_path} gespeichert")
# Update EXIF-Daten Anzeige
self.update_exif_display(image)
root = tk.Tk()
app = ImageBrowser(root)
root.mainloop()
Protokoll meiner Zusammenarbeit mit GPT-4 - Teil 5
















python
def save_exif(self):
if self.current_image_path is not None:
image = Image.open(self.current_image_path)
# Öffne eine Datei zum Speichern der EXIF-Informationen
with open(f"{self.current_image_path}_exif.txt", "w") as f:
# Schreibe alle Textinformationen aus den PNG-Metadaten in die Datei
for key, value in image.info.items():
if key != 'transparency':
f.write(f"Key: {key}, Value: {value}\n")
print(f"EXIF data for {self.current_image_path} saved to {self.current_image_path}_exif.txt")
















python
import os
import tkinter as tk
from tkinter import filedialog
from PIL import Image, ImageTk, PngImagePlugin
class ImageBrowser:
def __init__(self, master):
self.master = master
self.master.title('Bildbrowser')
self.master.geometry('1280x800')
self.panedwindow = tk.PanedWindow(master, orient='horizontal')
self.panedwindow.pack(fill='both', expand=True)
self.thumbnail_frame = tk.Frame(self.panedwindow)
self.thumbnail_canvas = tk.Canvas(self.thumbnail_frame, width=480, height=800)
self.thumbnail_canvas.pack(side='left', fill='both', expand=True, padx=10, pady=10)
self.scrollbar = tk.Scrollbar(self.thumbnail_frame, command=self.thumbnail_canvas.yview)
self.scrollbar.pack(side='left', fill='y')
self.thumbnail_canvas.configure(yscrollcommand=self.scrollbar.set)
self.thumbnail_container = tk.Frame(self.thumbnail_canvas)
self.thumbnail_canvas.create_window((0, 0), window=self.thumbnail_container, anchor='nw')
self.display_frame = tk.Frame(self.panedwindow)
self.canvas = tk.Canvas(self.display_frame, width=800, height=600)
self.canvas.pack(pady=10)
self.exif_label = tk.Label(self.display_frame, text='')
self.exif_label.pack()
self.delete_exif_button = tk.Button(self.display_frame, text='EXIF-Daten löschen', command=self.delete_exif)
self.delete_exif_button.pack(side='left', padx=5)
self.save_exif_button = tk.Button(self.display_frame, text='EXIF-Daten speichern', command=self.save_exif)
self.save_exif_button.pack(side='left', padx=5)
self.panedwindow.add(self.thumbnail_frame)
self.panedwindow.add(self.display_frame)
self.image_paths = []
self.current_image_path = None
# Pfad zum Startverzeichnis
self.initial_dir = '/path/to/your/directory'
self.thumbnail_container.bind('<Configure>', lambda e: self.thumbnail_canvas.configure(scrollregion=self.thumbnail_canvas.bbox('all')))
self.canvas.bind('<Configure>', self.show_image_resized)
def load_images(self):
self.initial_dir = filedialog.askdirectory(initialdir=self.initial_dir)
# Lösche alle vorhandenen Thumbnails und das Anzeigebild
for widget in self.thumbnail_container.winfo_children():
widget.destroy()
self.canvas.delete('all')
row, column = 0, 0
# Lade alle PNG-Bilder im ausgewählten Verzeichnis
for file in os.listdir(self.initial_dir):
if file.endswith('.png'):
image_path = os.path.join(self.initial_dir, file)
self.image_paths.append(image_path)
# Erzeuge ein Thumbnail des Bildes
image = Image.open(image_path)
image.thumbnail((128, 128)) # 128x128 Thumbnail
tk_image = ImageTk.PhotoImage(image)
# Zeige das Thumbnail in einem Button, der das Bild in voller Größe anzeigt, wenn es geklickt wird button = tk.Button(self.thumbnail_container, image=tk_image, text=file, compound='top', command=lambda i=image_path: self.show_image(i))
button.image = tk_image # Referenz zum Tkinter-Bild halten, um Garbage Collection zu verhindern
button.grid(row=row, column=column)
# Update column and row for next image
column += 1
if column > 3: # set the number of images per row
column = 0
row += 1
def show_image(self, image_path):
# Bild in voller Größe anzeigen
self.current_image_path = image_path
self.show_image_resized()
def show_image_resized(self, event=None):
if self.current_image_path is not None:
# Bild in voller Größe anzeigen
image = Image.open(self.current_image_path)
width, height = image.size
aspect_ratio = width / height
# Calculate new dimensions based on aspect ratio
new_width = self.canvas.winfo_width()
new_height = int(new_width / aspect_ratio)
if new_height > self.canvas.winfo_height():
new_height = self.canvas.winfo_height()
new_width = int(new_height * aspect_ratio)
# Resize image
image = image.resize((new_width, new_height), Image.ANTIALIAS)
tk_image = ImageTk.PhotoImage(image)
# Alles auf der Leinwand löschen und neues Bild zeichnen
self.canvas.delete('all')
self.canvas.create_image(0, 0, anchor='nw', image=tk_image)
self.canvas.image = tk_image # Referenz zum Tkinter-Bild halten, um Garbage Collection zu verhindern
# Update EXIF-Daten Anzeige
self.update_exif_display(image)
def update_exif_display(self, image):
exif_data = image.info
exif_text = '\n'.join(f'{key}: {value}' for key, value in exif_data.items() if key != 'transparency')
self.exif_label['text'] = exif_text
def delete_exif(self):
if self.current_image_path is not None:
image = Image.open(self.current_image_path)
pnginfo = PngImagePlugin.PngInfo()
# Setze alle Textinformationen auf leeren String
for key in image.info.keys():
if key != 'transparency':
pnginfo.add_text(key, '')
# Speichere das Bild ohne Textinformationen
image.save(self.current_image_path, "PNG", pnginfo=pnginfo)
print(f"Text-Metadaten aus {self.current_image_path} entfernt")
# Update EXIF-Daten Anzeige
self.update_exif_display(image)
def save_exif(self):
if self.current_image_path is not None:
image = Image.open(self.current_image_path)
# Öffne eine Datei zum Speichern der EXIF-Informationen
with open(f"{self.current_image_path}_exif.txt", "w") as f:
# Schreibe alle Textinformationen aus den PNG-Metadaten in die Datei
for key, value in image.info.items():
if key != 'transparency':
f.write(f"Key: {key}, Value: {value}\n")
print(f"EXIF data for {self.current_image_path} saved to {self.current_image_path}_exif.txt")
if __name__ == '__main__':
root = tk.Tk()
browser = ImageBrowser(root)
browser.load_images()
root.mainloop()
















python import os import tkinter as tk from tkinter import filedialog from PIL import Image, ImageTk, PngImagePlugin class ImageBrowser: def __init__(self, master): self.master = master self.master.title('Bildbrowser') self.master.geometry('1280x800') self.panedwindow = tk.PanedWindow(master, orient='horizontal') self.panedwindow.pack(fill='both', expand=True) self.thumbnail_frame = tk.Frame(self.panedwindow) self.thumbnail_canvas = tk.Canvas(self.thumbnail_frame, width=480, height=800) self.thumbnail_canvas.pack(side='left', fill='both', expand=True, padx=10, pady=10) self.scrollbar = tk.Scrollbar(self.thumbnail_frame, command=self.thumbnail_canvas.yview) self.scrollbar.pack(side='left', fill='y') self.thumbnail_canvas.configure(yscrollcommand=self.scrollbar.set) self.thumbnail_container = tk.Frame(self.thumbnail_canvas) self.thumbnail_canvas.create_window((0, 0), window=self.thumbnail_container, anchor='nw') self.display_frame = tk.Frame(self.panedwindow) self.display_frame.pack(fill='both', expand=True) self.canvas = tk.Canvas(self.display_frame) self.canvas.pack(fill='both', expand=True, padx=10, pady=10) self.button_frame = tk.Frame(self.display_frame) self.button_frame.pack(fill='x', padx=10, pady=10) self.exif_label = tk.Label(self.button_frame, text='') self.exif_label.pack() self.delete_exif_button = tk.Button(self.button_frame, text='EXIF-Daten löschen', command=self.delete_exif) self.delete_exif_button.pack(side='left', padx=5) self.save_exif_button = tk.Button(self.button_frame, text='EXIF-Daten speichern', command=self.save_exif) self.save_exif_button.pack(side='left', padx=5) self.panedwindow.add(self.thumbnail_frame) self.panedwindow.add(self.display_frame) self.image_paths = [] self.current_image_path = None # Pfad zum Startverzeichnis self.initial_dir = '/path/to/your/directory' self.thumbnail_container.bind('<Configure>', lambda e: self.thumbnail_canvas.configure(scrollregion=self.thumbnail_canvas.bbox('all'))) self.canvas.bind('<Configure>', self.show_image_resized) def load_images(self): self.initial_dir = filedialog.askdirectory(initialdir=self.initial_dir) # Lösche alle vorhandenen Thumbnails und das Anzeigebild for widget in self.thumbnail_container.winfo_children(): widget.destroy() self.canvas.delete('all') row, column = 0, 0 # Lade alle PNG-Bilder im ausgewählten Verzeichnis for file in os.listdir(self.initial_dir): if file.endswith('.png'): image_path = os.path.join(self.initial_dir, file) self.image_paths.append(image_path) # Erzeuge ein Thumbnail des Bildes image = Image.open(image_path) image.thumbnail((128, 128)) # 128x128 Thumbnail tk_image = ImageTk.PhotoImage(image) # Zeige das Thumbnail in einem Button, der das Bild in voller Größe anzeigt, wenn es geklickt wird button = tk.Button(self.thumbnail_container, image=tk_image, text=file, compound='top', command=lambda i=image_path: self.show_image(i)) button.image = tk_image # Referenz zum Tkinter-Bild halten, um Garbage Collection zu verhindern button.grid(row=row, column=column) # Update column and row for next image column += 1 if column > 3: # set the number of images per row column = 0 row += 1 def show_image(self, image_path): # Bild in voller Größe anzeigen self.current_image_path = image_path self.show_image_resized() def show_image_resized(self, event=None): if self.current_image_path is not None: # Bild in voller Größe anzeigen image = Image.open(self.current_image_path) width, height = image.size aspect_ratio = width / height # Calculate new dimensions based on aspect ratio new_width = self.canvas.winfo_width() new_height = int(new_width / aspect_ratio) if new_height > self.canvas.winfo_height(): new_height = self.canvas.winfo_height() new_width = int(new_height * aspect_ratio) # Resize image image = image.resize((new_width, new_height), Image.LANCZOS) tk_image = ImageTk.PhotoImage(image) # Alles auf der Leinwand löschen und neues Bild zeichnen self.canvas.delete('all') self.canvas.create_image(0, 0, anchor='nw', image=tk_image) self.canvas.image = tk_image # Referenz zum Tkinter-Bild halten, um Garbage Collection zu verhindern # Update EXIF-Daten Anzeige self.update_exif_display(image) def update_exif_display(self, image): exif_data = image.info text = f'Bild: {os.path.basename(self.current_image_path)}\n' for key, value in exif_data.items(): if key != 'transparency': text += f'{key}: {value}\n' self.exif_label.config(text=text) def delete_exif(self): # Lösche die EXIF-Informationen des aktuellen Bildes if self.current_image_path is not None: image = Image.open(self.current_image_path) meta = PngImagePlugin.PngInfo() for key in image.info.keys(): if key != 'transparency': meta.remove_text(key) image.save(self.current_image_path, "PNG", pnginfo=meta) self.show_image(self.current_image_path) def save_exif(self): # Speichere die EXIF-Informationen des aktuellen Bildes if self.current_image_path is not None: image = Image.open(self.current_image_path) with open(f"{self.current_image_path}_exif.txt", "w") as f: # Schreibe alle Textinformationen aus den PNG-Metadaten in die Datei for key, value in image.info.items(): if key != 'transparency': f.write(f"Key: {key}, Value: {value}\n") print(f"EXIF data for {self.current_image_path} saved to {self.current_image_path}_exif.txt") if __name__ == '__main__': root = tk.Tk() browser = ImageBrowser(root) browser.load_images() root.mainloop()















python def delete_exif(self): # Lösche die EXIF-Informationen des aktuellen Bildes if self.current_image_path is not None: image = Image.open(self.current_image_path) # Wir speichern das Bild neu, aber ohne die EXIF-Daten cleaned_image = Image.new("RGBA", image.size) cleaned_image.paste(image) # Speichern Sie das Bild an demselben Ort, wobei die EXIF-Daten effektiv entfernt werden cleaned_image.save(self.current_image_path) self.show_image(self.current_image_path)















Thomas Ell interessiert sich für Fotografie, 3D-Drucker, Roboter, technische Gadgets und Technik allgemein. Er kann mit Delphi, Lazarus, ArduinoIDE, Visual Studio und Eclipse in Object Pascal, C++, VB.NET, Java, Javascript und Maschinensprache programmieren. Er hat ein Blog, Steinlaus.de(öffnet im neuen Fenster) .



