0

我有这样的绘画应用程序女巫作品:

  • 在 mouseDown/mouseDragged 事件中,我使用 CIRadialGradient 在事件位置绘制一个点
  • 取 CIRadialGradient outputImage 并在 CISourceOverCompositing 过滤器中使用它作为 inputImage(开始时的 inputBackground 为空 CIImage)
  • 将CISourceOverCompositing outputImage设置为brushAccumulator图像(后面将brushAccumulator图像作为CISourceOverCompositing filter中的inputBackgroundImage)
  • 设置brushAccumulator 图像为CIBlendWithMask inputMaskImage 设置CIBlendWithMask outputImage 为mainImageAccumulator 图像绘制mainImageAccumulator 到屏幕

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

所以我想我可以从brushAccumulator的图像中制作NSBitmapImageRep并将其存储到NSMutableArray。但是我在更新brushAccumulator 时遇到了问题。我将新的 CIImage 设置为由 NSMutableArray 中的 NSBitmapImageRep 之一制成的新 CIImage 作为brushAccumulator 图像,但brushAccumulator 图像不会改变。

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

4

1 回答 1

0

这是一个适用于我的通用算法。您需要复制图像:1)您直接绘制的图像-“直接位图”2)绘制操作之前的外观副本-“撤消位图”

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

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

于 2013-02-16T21:43:56.050 回答