2012-07-29 35 views
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。我也尝试过这样一种方法,但它不起作用 - 我真的需要找到一种方法来在内存中将位图从闪存中刷到屏幕上,以便在处理过程中可以调整参数。

感谢您的帮助!

回答

1

图像可能在那里。它只是不可见。

相反的:

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() 
+0

Dude that works。史诗 - 这回答我的问题。谢谢! – jimf 2012-08-12 02:21:14