GUI-Bildschneidewerkzeug mit Python + Tkinter

"Ich möchte ein GUI-Trimm-Tool, das auf Python ausgeführt wird!"

Wenn Sie mit Bildern in Python arbeiten, möchten viele Benutzer sie möglicherweise mit GUI-Operationen zuschneiden.

Ich habe im Internet nach einem Referenzartikel gesucht, aber das ist ziemlich gut! Ich konnte so etwas nicht treffen, also lasse ich es hier.

Einführung

Tkinter ist ein Kit, mit dem Sie auf einfache Weise GUI-Tools in Python erstellen können. Normalerweise benutze ich Jupyter Notebook und ich habe ipywidgets verwendet, wenn ich eine GUI-Operation benötigte, aber dies ist nicht genug und ich habe diesmal Tkinter verwendet.

GUI-Tool zum Ausschneiden eines Rechtecks aus einem Bild

Ich werde einen Teil des Bildes ausschneiden und in Python speichern. Ich wollte nicht nur diesen Schnitt machen Ich wollte einen Prozess wie [Bildverarbeitung → Zuschneiden → Bildverarbeitung] durchführen. Die Motivation für diese Zeit war, dass ich es konsequent mit Python machen wollte.

Code und Kommentar

Code

crop.py


from tkinter import *
from PIL import Image
import os
os.chdir("c:\\users\\username")

#----------------------------------------------------------------------


def filenameMaker(num):
    return "%03d.png " % num


class MainWindow():

    #----------------

    def __init__(self, main):
        #Erstellen Sie eine Leinwand, um Bilder anzuzeigen
        self.canvas = Canvas(main, width=200, height=200)
        self.canvas.grid(row=0, column=0, columnspan=2, rowspan=4)

        #Bild(000.png bis 004.5 Stück png)Erfassen
        self.my_images = []
        self.file_num = 0
        for i in range(0, 5):
            self.my_images.append(PhotoImage(file=filenameMaker(i)))
        self.my_image_number = 0

        #Sichern Sie eine Nummer zur Aufbewahrung
        self.save_file_num = 0

        #Stellen Sie das erste Bild ein
        self.image_on_canvas = self.canvas.create_image(
            0, 0, anchor=NW, image=self.my_images[self.my_image_number])

        #Machen Sie verschiedene Knöpfe
        #Schaltfläche zum Anzeigen des nächsten Bildes
        self.button_next = Button(
            main, text="Next", command=self.onNextButton, width=20, height=5)
        self.button_next.grid(row=2, column=4, columnspan=2, rowspan=2)
        #Schaltfläche zum Anzeigen des vorherigen Bildes
        self.button_back = Button(
            main, text="Back", command=self.onBackButton, width=20)
        self.button_back.grid(row=4, column=4, columnspan=2)
        #Schaltfläche zum Speichern der Auswahl
        self.button_save = Button(
            main, text="Save", command=self.onSaveButton, width=25, height=5)
        self.button_save.grid(row=2, column=6, columnspan=3, rowspan=2)
        #Schaltfläche, um eine Speichernummer zurückzugeben
        self.button_saveb = Button(
            main, text="Save Back", command=self.onSavebButton, width=25)
        self.button_saveb.grid(row=4, column=6, columnspan=3)

        #Machen Sie einen Eintrag, um eine Nachricht anzuzeigen
        #Eintrag zur Anzeige der aktuellen Bildnummer
        self.message_num = Entry(width=50)
        self.message_num.insert(
            END, ("This image is " + filenameMaker(self.my_image_number)))
        self.message_num.grid(row=6, column=4, columnspan=5)
        #Eintrag zur Anzeige der nächsten Speichernummer
        self.message = Entry(width=50)
        self.message.insert(END, ("Next save-name is " +
                                  "save-" + filenameMaker(self.save_file_num)))
        self.message.grid(row=7, column=4, columnspan=5)

        #Reservevariablen für Schieberegler
        self.left = 0
        self.right = 0
        self.top = 0
        self.bottom = 0

        #Zeichnen Sie eine Linie für das Zuschneiden von Bildern auf der Leinwand
        self.canvas.create_line(self.left, 0, self.left,
                                200, tag="left_line", fill='green')
        self.canvas.create_line(self.right, 0, self.right,
                                200, tag="right_line", fill='red')
        self.canvas.create_line(
            0, self.top, 200, self.top, tag="top_line", fill='green')
        self.canvas.create_line(0, self.bottom, 200,
                                self.bottom, tag="bottom_line", fill='red')

        #Erstellen Sie einen Schieberegler zum Zuschneiden von Bildern
        self.left = Scale(main, label='left', orient='h',
                          from_=0, to=200, length=200, command=self.onSliderLeft)
        self.left.grid(row=4, column=0, columnspan=2, rowspan=2)

        self.right = Scale(main, label='right', orient='h',
                           from_=0, to=200, length=200, command=self.onSliderRight)
        self.right.grid(row=6, column=0, columnspan=2, rowspan=2)

        self.top = Scale(main, label='top', orient='v',
                         from_=0, to=200, length=200, command=self.onSliderTop)
        self.top.grid(row=4, column=2, rowspan=4)

        self.bottom = Scale(main, label='bottom', orient='v',
                            from_=0, to=200, length=200, command=self.onSliderBottom)
        self.bottom.grid(row=4, column=3, rowspan=4)

        #Verschieben Sie die Linie zum Zuschneiden von Bildern entsprechend dem angezeigten Bild
        self.left.set(0)
        self.right.set(self.my_images[self.my_image_number].width())
        self.top.set(0)
        self.bottom.set(self.my_images[self.my_image_number].height())

    #----------------

    def onBackButton(self):
        #Zurück zum letzten Bild
        if self.my_image_number == 0:
            self.my_image_number = len(self.my_images) - 1
        else:
            #Geh eins zurück
            self.my_image_number -= 1

        #Anzeigebild aktualisieren
        self.canvas.itemconfig(self.image_on_canvas,
                               image=self.my_images[self.my_image_number])

        #Die Position der Linie zum Ausschneiden des Bildes wurde entsprechend dem angezeigten Bild aktualisiert
        self.left.set(0)
        self.right.set(self.my_images[self.my_image_number].width())
        self.top.set(0)
        self.bottom.set(self.my_images[self.my_image_number].height())


        #Aktualisieren Sie den Inhalt des Eintrags
        self.message_num.delete(0, END)
        self.message_num.insert(
            END, ("This image is " + filenameMaker(self.my_image_number)))

    def onNextButton(self):
        #Gehen Sie einen Schritt vorwärts
        self.my_image_number += 1

        #Kehren Sie zum ersten Bild zurück
        if self.my_image_number == len(self.my_images):
            self.my_image_number = 0

        #Anzeigebild aktualisieren
        self.canvas.itemconfig(self.image_on_canvas,
                               image=self.my_images[self.my_image_number])

        #Die Position der Linie zum Ausschneiden des Bildes wurde entsprechend dem angezeigten Bild aktualisiert
        self.left.set(0)
        self.right.set(self.my_images[self.my_image_number].width())
        self.top.set(0)
        self.bottom.set(self.my_images[self.my_image_number].height())

        #Aktualisieren Sie den Inhalt des Eintrags
        self.message_num.delete(0, END)
        self.message_num.insert(
            END, ("This image is " + filenameMaker(self.my_image_number)))

    def onSaveButton(self):
        #Nehmen Sie das Anzeigebild auf
        self.temp_image = Image.open(filenameMaker(self.my_image_number))
        #An der ausgewählten Position ausschneiden
        self.cropped_image = self.temp_image.crop(
            (self.left.get(), self.top.get(), self.right.get(), self.bottom.get()))
        #sparen
        self.cropped_image.save("save-" + filenameMaker(self.save_file_num))

        self.save_file_num += 1

        #Aktualisieren Sie den Inhalt des Eintrags
        self.message.delete(0, END)
        self.message.insert(END, ("Next save-name is " +
                                  "save-" + filenameMaker(self.save_file_num)))

    def onSavebButton(self):
        self.save_file_num -= 1

        if self.save_file_num == -1:
            self.save_file_num = 0

        #Aktualisieren Sie den Inhalt des Eintrags
        self.message.delete(0, END)
        self.message.insert(END, ("Next save-name is " +
                                  "save-" + filenameMaker(self.save_file_num)))

    def onSliderLeft(self, args):
        # change line
        self.canvas.delete("left_line")
        self.canvas.create_line(
            self.left.get(), 0, self.left.get(), 200, tag="left_line", fill='green')

    def onSliderRight(self, args):
        # change line
        self.canvas.delete("right_line")
        self.canvas.create_line(
            self.right.get(), 0, self.right.get(), 200, tag="right_line", fill='red')

    def onSliderTop(self, args):
        # change line
        self.canvas.delete("top_line")
        self.canvas.create_line(0, self.top.get(), 200,
                                self.top.get(), tag="top_line", fill='green')

    def onSliderBottom(self, args):
        # change line
        self.canvas.delete("bottom_line")
        self.canvas.create_line(0, self.bottom.get(), 200,
                                self.bottom.get(), tag="bottom_line", fill='red')


#----------------------------------------------------------------------

root = Tk()
MainWindow(root)
root.mainloop()

Kommentar

Der Ausführungsbildschirm wird unten angezeigt. Der Bedienungsinhalt besteht darin, die Ausschnittposition mit jedem Schieberegler auszuwählen Zeigen Sie das nächste Bild mit der Schaltfläche Weiter an Zeigen Sie das vorherige Bild mit der Schaltfläche Zurück an Speichern Sie den Ausschnittbereich mit der Schaltfläche Speichern Klicken Sie auf die Schaltfläche Zurück speichern, um eine Bildnummer zu speichern 図1.png

Jedes Widget wird mit def __init __ (self, main): erstellt, um die Anzeigeposition zu definieren. .Grid wird verwendet, um die Anzeigeposition zu definieren. Beim Laden eines Bildes verwende ich "PhotoImage" und beim Speichern mit "def onSaveButton (self):" verwende ich PILs "Image", was unangenehm erscheint, aber dies ist ein rechteckiger Ausschnitt mit "PhotoImage". Ich konnte es nicht tun und ich konnte es mit "Image" nicht gut lesen.

↓ Gespeichertes Bild. save-000.png

Referenzierte Site

Recommended Posts

GUI-Bildschneidewerkzeug mit Python + Tkinter
[Python] Python und Sicherheit - Port-Scan-Tool mit Python
Ich habe eine GUI-App mit Python + PyQt5 erstellt
[Python] Ich habe mit Tkinter einen Youtube Downloader erstellt.
Bildverarbeitung mit Python
Einfache Erstellung von Verkaufstools mit Python-GUI: Schätzung erstellen
Bildverarbeitung mit Python (Teil 2)
Programmieren mit Python und Tkinter
Bildbearbeitung mit Python OpenCV
Ich habe einen Blackjack mit Python gemacht!
Sortieren von Bilddateien mit Python (2)
Sortieren von Bilddateien mit Python (3)
Erstellen Sie den Image Viewer mit Tkinter
Bildverarbeitung mit Python (Teil 1)
[GUI in Python] PyQt5-Layout-Management-
Tweet mit Bild in Python
Bilddateien mit Python sortieren
Bildverarbeitung mit Python (3)
Führen Sie Label mit tkinter [Python] aus.
Ich habe mit Python einen Blackjack gemacht.
[GUI mit Python] PyQt5-Vorbereitung-
Othello gemacht mit Python (wie GUI)
Ich habe Wordcloud mit Python gemacht.
[Python] Bildverarbeitung mit Scicit-Image
[GUI mit Python] PyQt5 -Paint-
Ich habe ein einfaches Tippspiel mit tkinter of Python gemacht
Lösung, wenn das Bild mit tkinter [python] nicht angezeigt werden kann
Einfache Erstellung von Verkaufstools mit Python-GUI: Suche nach Mitarbeiternummern
[Ich habe es mit Python gemacht] Tool für die Stapelausgabe von XML-Daten
So einfach wie möglich eine GUI mit Python erstellen [tkinter edition]
Ich habe mit Tkinter of Python ein Puzzlespiel (wie) gemacht
Einfache Erstellung von Verkaufstools mit Python-GUI: Kostenberechnung
Ich habe versucht, die Benutzeroberfläche neben Python und Tkinter dreiäugig zu gestalten
Einfache Erstellung von Verkaufstools mit Python GUI: Desktop-Anwendung veröffentlicht
Schneiden Sie ein Bild mit Python aus
Mit Flask erstellte SNS Python-Grundlagen
[Python] Verwenden von OpenCV mit Python (Bildfilterung)
Erstellen Sie mit tkinter eine Python-GUI
Lassen Sie uns eine GUI mit Python erstellen.
Numer0n mit Elementen, die mit Python erstellt wurden
Ich habe mit Python eine Lotterie gemacht.
[GUI mit Python] PyQt5-Der erste Schritt-
Die Bildverarbeitung mit Python 100 klopft an die Binärisierung Nr. 3
Einfache GUI App mit Tkinter Text
[GUI in Python] PyQt5-Drag & Drop-
Othello-Spieleentwicklung mit Python
Lassen Sie uns mit Python Image Scraping durchführen
Finden Sie Bildähnlichkeit mit Python + OpenCV
100 Bildverarbeitung mit Python Knock # 2 Graustufen
[GUI mit Python] PyQt5 -Custom Widget-
Ich habe mit Python einen Daemon erstellt
[Python] Erstellen mehrerer Fenster mit Tkinter
Sende Bild mit Python und speichere mit PHP
Erzeugung von Verlaufsbildern mit Python [1] | np.linspace
GUI-Erstellung in Python mit tkinter 2
Lebensspiel mit Python [ich habe es geschafft] (auf Terminal & Tkinter)
Unterschied im Verhalten des transparenten Frames mit tkinter im Pyinstaller [Python]
[Python] Ich habe einen Bildbetrachter mit einer einfachen Sortierfunktion erstellt.
Videowiedergabe mit Ton auf Python !! (tkinter / imageio)
Grundlagen der binärisierten Bildverarbeitung durch Python
Bildverarbeitung mit Python 100 Knock # 10 Medianfilter