1

我有显示图像的 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()
4

1 回答 1

1

这取决于您应用的函数集,如果它们是可逆的,那么它变得非常简单。

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

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

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

于 2013-01-09T02:30:02.467 回答