2013-01-31 109 views
0

我有繪畫應用巫婆就像是:撤消CIImageAccumulator

  • 在鼠標按下/的mouseDragged事件我畫事件位置的點與 CIRadialGradient
  • 採取CIRadialGradient outputImage和CISourceOverCompositing 過濾器inputImage的使用(在開始處的inputBackground爲空CIImage)
  • 將CISourceOverCompositing outputImage設置爲brushAccumulator圖像 (稍後將brushAccumulator圖像用作inputBackgroundImage的 CISourc eOverCompositing過濾器)
  • 設置brushAccumulator形象CIBlendWithMask inputMaskImage集 CIBlendWithMask outputImage作爲mainImageAccumulator圖像繪製 mainImageAccumulator篩選

我想要實現撤消方法。首先,我想我可以使用brushAccumulator.image(CIImage)作爲撤消對象(將其添加到mutableArray中,然後當調用undo方法將brushAccumulator圖像設置爲mutableArray對象之一時),但我發現: CIImage不是包含像素,它只是一系列構建它的指令的結果,例如CIFilter的輸出。所以如果你複製CIImage,你只需複製這些指令,修改時會修改輸出。

所以我想我可以從brushAccumulator的圖像製作NSBitmapImageRep並將它存儲到NSMutableArray。但是我遇到了更新brushAccumulator的問題。我將NSMutableArray中的一個NSBitmapImageRep作爲brushAccumulator圖像設置爲新的CIImage,但brushAccumulator圖像不會更改。

什麼可以爲您提供我實現撤銷/重做效果,而我的繪畫應用程序是基於CIImageAccumulator(類似於CIMicroPaint示例代碼)?

回答

0

這是一個適用於我的通用算法。你需要你的形象的副本: 1)你是直接繪製一個TO-「直接位圖」 2)的是什麼樣子抽籤之前操作 - 「取消位圖」

所以副本你然後從undo上下文中複製出changeFrame,以便稍後用於撤消(並將changeFrame與它一起存儲在某些基於對象的對象中) SOChangeBitmap)。 然後,您從直接位圖的changeFrame中拉出圖像,並將撤銷位圖中的像素替換爲更改幀。

然後,撤消,你把SOChangeBitmap(圖像+ changeFrame),並把它應用到直接位圖(和更新撤銷位爲好)。