首页 文章

撤消CIImageAccumulator

提问于
浏览
0

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

  • 在mouseDown / mouseDragged事件中,我使用CIRadialGradient在事件位置绘制一个点

  • 使用CIRadialGradient outputImage并在CISourceOverCompositing过滤器中将其用作inputImage(beggining的inputBackground为空CIImage)

  • 将CISourceOverCompositing outputImage设置为brushAccumulator图像(稍后将brushAccumulator图像用作CISourceOverCompositing过滤器中的inputBackgroundImage)

  • 将brushAccumulator图像设置为CIBlendWithMask inputMaskImage设置CIBlendWithMask outputImage作为mainImageAccumulator图像将mainImageAccumulator绘制到屏幕

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

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

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

1 回答

  • 0

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

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

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

相关问题