2017-11-22 4 views
0

이미지 작업용 애플리케이션을 만들었지 만 문제가 발생했습니다. 사진에 필터를 추가 할 수 없으며이 문제를 해결하는 방법을 모르겠습니다.CIImage에 필터 추가하기

나는 CIImage와 작업에 대한 자신의 클래스를 썼다 :

import CoreImage 

typealias Filter = (CIImage) ->() 
typealias ParametersFilter = Dictionary<String, AnyObject> 

public protocol PXImageDelegate { 
    func updateImage(picker: PXImage) 
} 

public class PXImage: CIImage { 

public var delegate: PXImageDelegate? 

open var brightness: Float = 0 { 
    willSet (value) { 
     brightness = value 
     brightness(value)(self) 
     updateImage() 
    } 
} 

open var contrast: Float = 1 { 
    willSet (value) { 
     contrast = value 
     contrast(value)(self) 
     updateImage() 
    } 
} 

open var saturation: Float = 1 { 
    willSet (value) { 
     saturation = value 
     saturation(value)(self) 
     updateImage() 
    } 
} 

private func brightness(_ value: Float) -> Filter { 
    return { image in 
     let parameters: ParametersFilter = [ 
      kCIInputBrightnessKey: value as AnyObject, 
      kCIInputImageKey: image 
     ] 

     self.applyingFilter("CIColorControls", parameters: parameters) 
    } 
} 

private func contrast(_ value: Float) -> Filter { 
    return { image in 
     let parameters: ParametersFilter = [ 
      kCIInputContrastKey: value as AnyObject, 
      kCIInputImageKey: image 
     ] 

     self.applyingFilter("CIColorControls", parameters: parameters) 
    } 
} 

private func saturation(_ value: Float) -> Filter { 
    return { image in 
     let parameters: ParametersFilter = [ 
      kCIInputSaturationKey: value as AnyObject, 
      kCIInputImageKey: image 
     ] 

     self.applyingFilter("CIColorControls", parameters: parameters) 
    } 
} 

func updateImage() { 
    delegate?.updateImage(picker: self) 
} 

을하지만 밝기, 대비의 값을 변경할 때 포화 아무 반응이 없습니다. 사진은 정적으로 유지됩니다. 왜 이런 일이 일어나는 걸까요?

답변

1

먼저, CIImage.applyingFilter의 메소드 서명을 살펴보십시오. 그것은 돌연변이 방법이 아닙니다. 새로운 CIImage를 반환합니다. CIImage가 작동하는 두 번째 방법은 기본적으로 이미지 저장과 필터에 대한 쉐이더 명령을 저장하는 것입니다. 당신이 implicitly (예를 들어 UIImage로 변환)하거나 CIContext를 명시 적으로 만들 때까지 실제로 셰이더를 컴파일하고 실행하지 않습니다. 내가 할 수 있기 때문에 당신이 이것을하는지 아닌지를 말할 수 없다. 당신의 코드를 보아라. 어떤 경우 든 입력 매개 변수에 의해 제어되는 일련의 필터가 있어야합니다. 매개 변수가 변경되면 필터를 간단히 재평가 할 수 있습니다.

+0

답장을 보내 주셔서 감사합니다. CIContext를 사용하여 GLKView 내부에이 이미지를 그립니다. – nik3212

관련 문제