我有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()
答案 0 :(得分:1)
这取决于您正在应用的功能集,如果它们是可逆的,那么它就变得非常简单。
从实际沿y轴翻转的mirror
函数开始。如果要撤消该操作,只需再次沿y轴翻转即可。否定图像的方式相同。要做出否定,您知道图像类型接受的最大值(例如255),因此您只需执行255 - 图像。要恢复它,再次应用255 - 图像。因此,在这些情况下,您的history
可能很简单就是应用的函数(因此您只需调用它们来撤消操作)。
现在考虑旋转90度。您无法通过旋转90度来撤消它,而是需要使用-90。通过这项新操作,您的history
显然需要进行修改。您实际上想要存储执行的操作列表以及转换的反转(并且您只向用户显示第一个信息)。
让我们更多地增加问题。您现在可以旋转任意度数,这需要使用插值方法。通过简单地否定度数,通常无法通过旋转撤消它,在应用初始旋转之前生成的图像将不相同。应用N个任意旋转然后尝试撤消它们会变得更糟,离散网格不允许这种完美的撤消。还有一些操作不能简单地撤消,与处于离散或连续领域无关(侵蚀就是一个简单的例子)。此时,您需要区分可逆操作和不可逆操作,这实际上很容易。问题在于,当用户执行不可逆操作时,最简单的方法是在修改当前映像(在内存中或磁盘上)之前保存当前映像。如果您有足够的可用内存/磁盘,则完全保存图像不是问题。