"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.
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.
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.
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()
filenameMaker (num)
. (2017.04.07)
Eine saubere Kopie mit autopep8 -i crop.py
. (2017.04.07)
Unnötigen Code entfernt. (2017.04.09)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
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.
Versuchen Sie es mit Pythons Tkinter --Qiita http://qiita.com/nnahito/items/ad1428a30738b3d93762
Einführung in Easy Python / Tkinter http://www.geocities.jp/m_hiroi/light/pytk01.html
Python Tkinter: Update Image in Canvas - Stack Overflow http://stackoverflow.com/questions/19838972/python-tkinter-update-image-in-canvas
Recommended Posts