在Gui中撤消图像

时间:2013-01-08 16:51:01

标签: python python-imaging-library

我有Gui显示图像和B& W,镜子等的几个按钮 我需要实现一个调用undo函数的撤销按钮,这样就可以撤消对图像进行的最后一次操作。
我需要使用global变量 - history=[](空列表)来保存对图像所做的所有操作。 我不知道怎么做,我很高兴得到一个方向 部分代码:

def mirror():
    '''Flips the image like a mirror does, left to right'''
    global img
    out = Image.new('L',img.size, 'white')
    out=flip(img)
    img = out  
    display() 

def negate():
    '''Negate the image pixels'''
    global img
    out = Image.new('L',img.size, 'white')
    out=negate_pxls(img)
    img = out  
    display()

1 个答案:

答案 0 :(得分:1)

这取决于您正在应用的功能集,如果它们是可逆的,那么它就变得非常简单。

从实际沿y轴翻转的mirror函数开始。如果要撤消该操作,只需再次沿y轴翻转即可。否定图像的方式相同。要做出否定,您知道图像类型接受的最大值(例如255),因此您只需执行255 - 图像。要恢复它,再次应用255 - 图像。因此,在这些情况下,您的history可能很简单就是应用的函数(因此您只需调用它们来撤消操作)。

现在考虑旋转90度。您无法通过旋转90度来撤消它,而是需要使用-90。通过这项新操作,您的history显然需要进行修改。您实际上想要存储执行的操作列表以及转换的反转(并且您只向用户显示第一个信息)。

让我们更多地增加问题。您现在可以旋转任意度数,这需要使用插值方法。通过简单地否定度数,通常无法通过旋转撤消它,在应用初始旋转之前生成的图像将不相同。应用N个任意旋转然后尝试撤消它们会变得更糟,离散网格不允许这种完美的撤消。还有一些操作不能简单地撤消,与处于离散或连续领域无关(侵蚀就是一个简单的例子)。此时,您需要区分可逆操作和不可逆操作,这实际上很容易。问题在于,当用户执行不可逆操作时,最简单的方法是在修改当前映像(在内存中或磁盘上)之前保存当前映像。如果您有足够的可用内存/磁盘,则完全保存图像不是问题。