2013-01-31 1 views
0

나는 그림 응용 프로그램 마녀 그런 일이 :취소 CIImageAccumulator

내가 CIRadialGradient
  • 와 이벤트 위치에 점을 그려 mouseDown /의 mouseDragged 이벤트에
    • CIRadialGradient outputImage을 가지고 inputImage 등 CISourceOverCompositing 필터에서 사용 (CUmage에서 inputBackground가 비어 있습니다.)
    • CISourceOverCompositing outputImage를 brushAccumulator 이미지로 설정하십시오. (나중에 brushAccumulator 이미지가 inputBackgroundImage로 사용됩니다. CISourc eOverCompositing 필터) mainImageAccumulator 이미지로 CIBlendWithMask inputMaskImage 설정 CIBlendWithMask outputImage로
    • 설정 brushAccumulator 이미지는

    화면에 mainImageAccumulator을 그립니다 그리고 실행 취소 방법을 구현하려는. 첫째로 나는 brushAccumulator.image (CIImage)를 undo 객체로 사용할 수 있다고 생각했다. (mutableArray에 추가하고, undo 메소드가 호출되면 mutableArray 객체 중 하나에 brushAccumulator 이미지를 설정한다.) 그러나 나는 그것을 발견했다 : CIImage는 포함 된 이미지가 아니다. 예를 들어 CIFilter의 출력과 같이 일련의 명령을 작성한 결과 일뿐입니다. 따라서 CIImage를 복사하는 경우 해당 지침을 복사하면 수정할 때 출력이 수정됩니다.

    그래서 brushAccumulator의 이미지에서 NSBitmapImageRep을 만들고 NSMutableArray에 저장할 수있을 것이라고 생각했습니다. 하지만 brushAccumulator를 업데이트하는 데 문제가 발생했습니다. NSMutableArray에서 NSBitmapImageRep 중 하나로 만든 새 CIImage를 brushAccumulator 이미지로 설정했지만 brushAccumulator 이미지는 변경되지 않습니다.

    페인팅 응용 프로그램이 CIImageAccumulator (CIMicroPaint 샘플 코드와 유사)를 기반으로하면서 실행 취소/다시 실행 효과를 얻으려면 무엇을 제공 할 수 있습니까?

  • 답변

    0

    다음은 저에게 적합한 일반적인 알고리즘입니다. 이미지의 복사본이 필요합니다 : 1) "직접 비트 맵" 2) 드로잉 작업 전에 보이는 것의 복사본 - "비트 맵 실행 취소"

    직접 그리기 및 변경 프레임이 무엇인지 기록하십시오 ("changeFrame") 그런 다음 undo 컨텍스트에서 changeFrame을 복사하여 나중에 실행 취소 할 때 사용할 수 있습니다 (그리고 changeFrame을 일부 개체 - SOChangeBitmap). 그런 다음 직접 비트 맵의 ​​changeFrame에서 이미지를 가져 와서 변경 프레임이있는 실행 취소 비트 맵의 ​​픽셀을 바꿉니다.

    그런 다음 실행 취소하려면 SOChangeBitmap (image + changeFrame)을 가져 와서 직접 비트 맵에 적용하고 실행 취소 비트 맵을 업데이트하십시오.