0

これが問題です-

私は一連の画像操作を繰り返すプログラムを書いています - 画像全体と画像の一部だけに影響を与えます。これらの変更をユーザー (自分自身) に示す必要があるため、操作が行われたときに何が問題になっているのかを確認できます。

私はもともとこれを行うために PIL と Tkinter を使用しようとしましたが、GUI に画像をロードすることさえできませんでした。これは、多くの Google 検索を介して Web のコーナーから形成されたコードの一部です。

from Tkinter import *
import Image, ImageDraw, ImageTk
import time

class Test(Frame):
    def __init__(self):
        Frame.__init__(self)
        self.c = Canvas(self, width=574, height=431, bg="red")
        self.c.pack()
        Button(self, text="Process", command=self.procImg).pack()
        Button(self, text="Quit", command=self.quit).pack()
    def procImg(self):
        t = time.time()
        self.flashImg = Image.open("./in_img/resize.bmp")
        #self.flashImg = flashImg.resize((574, 431))
        self.flashImg = self.flashImg.convert("L")
        #self.photo = ImageTk.BitmapImage(flashImg)
        self.c.photo = ImageTk.PhotoImage(self.flashImg)
        self.c.create_image(574, 431, anchor=NW, image=self.c.photo)
        self.c.create_rectangle(50, 50, 100, 100, fill="blue")
        self.update()
        print time.time()-t

t = Test()
t.pack()
t.mainloop()

したがって、上記のコードはかなり悪いことはわかっていますが、少なくともこれに取り組んでいることを証明するために何かを投稿したかったのです。

Python を使用してこの問題にアプローチする新しい方法を提案してくれる人はいますか? 私は別の言語を学びたくない - 私は Tkinter ライブラリに慣れていないので、これにより適したものがあれば、新しいライブラリを学ぶことに問題はありません。

また、参考までに、「resize.bmp」画像は、デジタル カメラからのサイズ変更された .JPG です。私もそれを試してみましたが、うまくいきませんでした.GUIでメモリから画面にビットマップをフラッシュする方法を見つけて、処理中にパラメータを調整できるようにする必要があります。

ご協力いただきありがとうございます!

4

1 に答える 1

2

イメージはきっとある。見えないだけです。

それ以外の :

self.c.create_image(574, 431, anchor=NW, image=self.c.photo)

試す :

self.c.create_image(0, 0, anchor=NW, image=self.c.photo)

また、キャンバス イメージ アイテムへの参照を保持すると、さまざまなイメージを入れ替えることができます。

例えば。(self.canvasItem) 以下:

from Tkinter import * 
from PIL import Image, ImageTk, ImageDraw, ImageOps, ImageEnhance


class ImageButcher(Tk):
    def __init__(self):
        Tk.__init__(self)

        #create ui
        f = Frame(self, bd=2)

        self.colour = StringVar(self)
        self.colourMenu = OptionMenu(f, self.colour,
                                     *('red','green','blue','white'))
        self.colourMenu.config(width=5)
        self.colour.set('red')
        self.colourMenu.pack(side='left')

        self.rectangleButton = Button(f, text='Rectangle',
                                    command=self.draw_rectangle)
        self.rectangleButton.pack(side='left')

        self.brightenButton = Button(f, text='Brighten',
                                    command=self.on_brighten)
        self.brightenButton.pack(side='left')

        self.mirrorButton = Button(f, text='Mirror',
                                    command=self.on_mirror)
        self.mirrorButton.pack(side='left')
        f.pack(fill='x')

        self.c = Canvas(self, bd=0, highlightthickness=0,
                        width=100, height=100)
        self.c.pack(fill='both', expand=1)

        #load image
        im = Image.open('IMG_1584.JPG')
        im.thumbnail((512,512))

        self.tkphoto = ImageTk.PhotoImage(im)
        self.canvasItem = self.c.create_image(0,0,anchor='nw',image=self.tkphoto)
        self.c.config(width=im.size[0], height=im.size[1])

        self.img = im
        self.temp = im.copy() # 'working' image

    def display_image(self, aImage):
        self.tkphoto = pic = ImageTk.PhotoImage(aImage)
        self.c.itemconfigure(self.canvasItem, image=pic)

    def on_mirror(self):
        im = ImageOps.mirror(self.temp)
        self.display_image(im)
        self.temp = im

    def on_brighten(self):
        brightener = ImageEnhance.Brightness(self.temp)
        self.temp = brightener.enhance(1.1) # +10%
        self.display_image(self.temp)

    def draw_rectangle(self):
        bbox = 9, 9, self.temp.size[0] - 11, self.temp.size[1] - 11        
        draw = ImageDraw.Draw(self.temp)
        draw.rectangle(bbox, outline=self.colour.get())
        self.display_image(self.temp)


app = ImageButcher()
app.mainloop()
于 2012-07-31T22:32:01.930 に答える