像素处理
问题描述:
这里的问题 -像素处理
我正在写一个程序,将通过一系列的图像操作迭代 - 既影响整体形象,以及只是部分图片。我需要向用户(我自己)演示这些更改,以便我可以在发生操作时看到发生了什么问题。
我本来试图用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。我也尝试过这样一种方法,但它不起作用 - 我真的需要找到一种方法来在内存中将位图从闪存中刷到屏幕上,以便在处理过程中可以调整参数。
感谢您的帮助!
答
图像可能在那里。它只是不可见。
相反的:
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()
Dude that works。史诗 - 这回答我的问题。谢谢! – jimf 2012-08-12 02:21:14