##はじめに
以前自作のデータセットを作ったのですが、その際GUI上で簡単にトリミングができたら便利だなと思ったところから開発をスタートしました。
上記の例では全て統一したピクセル数の画像を用意していました。
ただ実際の現場では、元画像のサイズ自体もそれぞれ違うことがあり、クリックで簡単に処理したかったのです。
一気に作るのは自分の力量的にしんどかったので、前回の内容をまず作ってそれから改良する形になりました。
##環境
- windows10
- python3.8.10
- pillow8.3.1
- tkinter8.6
##内容
メイン画面とサブ画面を作っています。
メイン画面:トリミングしたい部分の選択・表示など
サブ画面:トリミング幅の指定(ここでは正方形のみ)
import tkinter
from PIL import Image
class Application(tkinter.Frame):
def __init__(self, master=None):
super().__init__(master)
master.title('画面')
self.pack()
self.create_widgets()
def create_widgets(self):
self.canvas = tkinter.Canvas(self, width=image.width(), height=image.height())
self.canvas.grid(row=0, column=0, rowspan=3)
self.canvas.create_image(0, 0, anchor='nw', image=image)
self.canvas.create_rectangle(-12, -12, -2, -2, fill='blue',
outline='white', width=2,
tag='marker')
self.canvas.bind("<ButtonPress-1>", self.move_marker)
button = tkinter.Button(self, text='リセット', command=self.reset)
button.grid(row=0, column=1)
#サブ画面の作成
self.subwindow = tkinter.Toplevel()
self.subwindow.geometry('200x100')
self.label = tkinter.Label(self.subwindow,text='1辺のピクセル数を入力してください')
self.entry = tkinter.Entry(self.subwindow,width=15)
self.subbutton = tkinter.Button(self.subwindow,text='切り取り')
self.subbutton.bind('<Button-1>',self.trim)
self.label.pack()
self.entry.pack()
self.subbutton.pack()
def move_marker(self, event):
global a,b
a = event.x
b = event.y
print("clicked at ", a, b)
self.canvas.moveto('marker', event.x - 7, event.y - 7)
#指定した座標を中心にトリミング
def trim(self,event):
global x1,y1
self.num = int(self.entry.get())//2
x1 = a-self.num
y1 = b+self.num
x2 = a+self.num
y2 = b-self.num
self.canvas.create_rectangle((x1,y1,x2,y2),
outline='blue', width=2,
tag='marker2')
trim_image = Image.open('kikagaku.png')
trim_image2 = trim_image.crop((x1,y2,x2,y1))
trim_image2.save('trim_image.png')
def reset(self):
print('reset')
self.canvas.moveto('marker', -12, -12)
self.canvas.delete('marker2')
root = tkinter.Tk()
image = tkinter.PhotoImage(file='kikagaku.png')
app = Application(root)
app.mainloop()
切り取った画像も、動画内で表示されている枠の部分と同じになっていることがわかる。
##まとめ
何とか画像処理ソフトとしては形になったのではないでしょうか(細かい部分はさておき)。
気力を使い果たしたので、今日はもうやる気が出ない