我有绘画应用程序巫婆那样:
我想实现撤消方法。首先我认为我可以使用brushAccumulator.image(CIImage)作为撤销对象(将其添加到mutableArray,然后在调用撤消方法时将brushAccumulator图像设置为mutableArray对象之一)但我发现: CIImage不是包含像素的图像,它只是构建它的一系列指令的结果,例如CIFilter的输出。因此,如果您复制CIImage,则只需复制这些指令,这些指令在修改后会修改输出。
所以我想我可以从brushAccumulator的图像中创建NSBitmapImageRep并将其存储到NSMutableArray。但是我遇到了更新brushAccumulator的问题。我将NSMitmapImageRep中的一个新的CIImage设置为NSMutableArray作为brushAccumulator图像,但是brushAccumulator图像不会改变。
你能为我提供什么来实现撤消/重做效果,而我的绘画应用程序是基于CIImageAccumulator(类似于CIMicroPaint示例代码)?
答案 0 :(得分:0)
这是一个适合我的通用算法。您需要复制图像: 1)你直接绘制的那个 - “直接位图” 2)在绘制操作之前看起来的副本 - “撤消位图”
所以你直接绘制,并记下更改框架是什么(“changeFrame”) 然后从undo上下文中复制出changeFrame,以便稍后用于撤消(并将changeFrame与它一起存储在某个object-SOChangeBitmap中)。 然后从直接位图的changeFrame中提取图像,并用更改框替换撤消位图中的像素。
然后,要撤消,您可以获取SOChangeBitmap(image + changeFrame)并将其应用于直接位图(并更新撤消位图)。