2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Tkinterで画像処理ソフトを作ってみた

Posted at

##はじめに
以前自作のデータセットを作ったのですが、その際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()

メディア1.gif
trim_image.png

切り取った画像も、動画内で表示されている枠の部分と同じになっていることがわかる。

##まとめ
何とか画像処理ソフトとしては形になったのではないでしょうか(細かい部分はさておき)。
気力を使い果たしたので、今日はもうやる気が出ない:sleeping:

2
2
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?