Zum Hauptinhalt Zur Navigation

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

Fast jeder weiß, dass GPT-4 beim Programmieren helfen kann. Ich habe mir in Python einen Bildbrowser von ihm machen lassen - ohne selbst eine Zeile Code zu schreiben. Protokoll einer verblüffenden Leistung.
/ Thomas Ell
122 Kommentare News folgen (öffnet im neuen Fenster)
In einer halben Stunde programmiert: mein Bildbrowser (Bild: Thomas Ell)
In einer halben Stunde programmiert: mein Bildbrowser Bild: Thomas Ell

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) .


Relevante Themen