0

私はそのように絵を描くアプリの魔女の作品を持っています:

  • mouseDown/mouseDragged イベントで、CIRadialGradient を使用してイベントの場所にポイントを描画します
  • CIRadialGradient outputImage を取り、それを CISourceOverCompositing フィルターで inputImage として使用します (開始時の inputBackground は空の CIImage です)。
  • CISourceOverCompositing outputImage を brushAccumulator イメージとして設定します (後で、brushAccumulator イメージは CISourceOverCompositing フィルタの inputBackgroundImage として使用されます)。
  • brushAccumulator 画像を CIBlendWithMask inputMaskImage として設定する CIBlendWithMask outputImage を mainImageAccumulator 画像として設定する mainImageAccumulator を画面に描画する

そして、undo メソッドを実装したいと思います。まず、brushAccumulator.image (CIImage) を元に戻すオブジェクトとして使用できると考えました (それを mutableArray に追加し、元に戻すメソッドが呼び出されたときに、brushAccumulator イメージを mutableArray オブジェクトの 1 つに設定します)。 、それは単にそれを構築するための一連の指示の結果であり、たとえば CIFilter の出力です。したがって、CIImage をコピーする場合は、それらの命令をコピーするだけで、変更すると出力が変更されます。

そこで、brushAccumulator のイメージから NSBitmapImageRep を作成し、それを NSMutableArray に格納できると考えました。しかし、brushAccumulator の更新で問題が発生しました。NSMutableArray の NSBitmapImageRep の 1 つから作成された新しい 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 に答える