撤消CIImageAccumulator

时间:2013-01-31 14:03:11

标签: objective-c macos core-image accumulator ciimage

我有绘画应用程序巫婆那样:

  • 在mouseDown / mouseDragged事件中,我在事件位置绘制一个点 CIRadialGradient
  • 获取CIRadialGradient outputImage并在CISourceOverCompositing中使用它 filter as inputImage(beggining的inputBackground为空CIImage)
  • 将CISourceOverCompositing outputImage设置为brushAccumulator图像 (稍后将brushAccumulator图像用作inputBackgroundImage CISourceOverCompositing过滤器)
  • 将brushAccumulator图像设置为CIBlendWithMask inputMaskImage Set CIBlendWithMask outputImage作为mainImageAccumulator图像绘制 mainImageAccumulator to screen

我想实现撤消方法。首先我认为我可以使用brushAccumulator.image(CIImage)作为撤销对象(将其添加到mutableArray,然后在调用撤消方法时将brushAccumulator图像设置为mutableArray对象之一)但我发现: CIImage不是包含像素的图像,它只是构建它的一系列指令的结果,例如CIFilter的输出。因此,如果您复制CIImage,则只需复制这些指令,这些指令在修改后会修改输出。

所以我想我可以从brushAccumulator的图像中创建NSBitmapImageRep并将其存储到NSMutableArray。但是我遇到了更新brushAccumulator的问题。我将NSMitmapImageRep中的一个新的CIImage设置为NSMutableArray作为brushAccumulator图像,但是brushAccumulator图像不会改变。

你能为我提供什么来实现撤消/重做效果,而我的绘画应用程序是基于CIImageAccumulator(类似于CIMicroPaint示例代码)?

1 个答案:

答案 0 :(得分:0)

这是一个适合我的通用算法。您需要复制图像: 1)你直接绘制的那个 - “直接位图” 2)在绘制操作之前看起来的副本 - “撤消位图”

所以你直接绘制,并记下更改框架是什么(“changeFrame”) 然后从undo上下文中复制出changeFrame,以便稍后用于撤消(并将changeFrame与它一起存储在某个object-SOChangeBitmap中)。 然后从直接位图的changeFrame中提取图像,并用更改框替换撤消位图中的像素。

然后,要撤消,您可以获取SOChangeBitmap(image + changeFrame)并将其应用于直接位图(并更新撤消位图)。