0

问题来了——

我正在编写一个程序,它将遍历一系列图像操作——既影响整个图像,也影响图像的一部分。我需要向用户(我自己)演示这些更改,以便我可以看到我的操作发生了什么问题。

我最初尝试使用 PIL 和 Tkinter 来执行此操作 - 但我什至无法将图像加载到 GUI 中 - 这是通过许多谷歌搜索从网络角落形成的一些代码:

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 回答