2017-10-31 20 views
1

이미지에 여러 개의 CIFilter를 적용하려고하는데 두 번째 필터를 적용해도 아무런 결과가 나타나지 않습니다. 나는 작물을 만들어 다음과 같은 기능을 회전했습니다createCGImage는 CIFilter를 사용하여 이미지를 회전/자르기 할 때 nil을 반환합니다.

func crop(_ image: CIImage) -> CIImage?{ 
    let cropRectangle = CGRect(x: 0, y: 0, width: 0.5*image.extent.width, height: 0.5*image.extent.height) 
    guard let filter = CIFilter(name: "CICrop") else {print("Could not create filter.");return nil} 
    filter.setValue(image, forKey: "inputImage") 
    filter.setValue(cropRectangle, forKey: "inputRectangle") 
    return filter.outputImage 
} 

func rotate(image: CIImage, rotation: CGFloat) -> CIImage?{ 
    guard let filter = CIFilter(name: "CIAffineTransform") else {print("Unable to generate filter");return nil} 
    let rotationTransform = CGAffineTransform.init(rotationAngle: rotation) 
    filter.setValue(image, forKey: "inputImage") 
    filter.setValue(rotationTransform, forKey: "inputTransform") 
    return filter.outputImage 
} 

나는 작물 다음 회전을 적용하면, 내 context.createCGImage이 잘 작동하지만 그때 작물을 회전 적용 할 때, 그것은 전무를 반환합니다. CIImage에서 .extension을 확인했는데 자르기 직사각형이 경계 내에 있는지 확인하기 위해 자르기를 시도하고 있습니다. 아이디어를 받아들입니다.

let context = CIContext(options: nil) 
     guard let ciImage = CIImage(image: #imageLiteral(resourceName: "sample3")) else {fatalError("Error on image generation!")} 
     guard let ciRotated = self.rotate(image: ciImage, rotation: CGFloat(Double.pi*3/2)) else {print("Could not rotate.");return} 
     guard let ciCropped = self.crop(ciRotated) else {print("Error cropping.");return} 
     guard let final = context.createCGImage(ciCropped, from: ciCropped.extent) else {print("Error on CG gen.");return} 

답변

0

이 문제는 회전 된 이미지의 출처가 0,0에서 더 이상이었다이었다, 그래서 자르기 사각형 자르기 함수 반환을 아웃 오브 바운드 정말로 다음은 2 위에서 언급 한 functtions에 내 전화입니다 0x0 크기의 이미지. 나는 원점을 0,0으로 되돌리기 위해 번역을 추가했고 모든 것이 잘 작동했다. 여기 유사 문제 : Core Image: after using CICrop, applying a compositing filter doesn't line up

번역 기능 제작 한 :

  let context = CIContext(options: nil) 
     guard let ciImage = CIImage(image: #imageLiteral(resourceName: "sample3")) else {fatalError("Error on image generation!")} 
     guard let ciRotated = self.rotate(image: ciImage, rotation: CGFloat(Double.pi*3/2)) else {print("Could not rotate.");return} 
     guard let ciTranslated = self.translation(image: ciRotated, x: 0, y: ciRotated.extent.height) else {print("Unable to translate."); return} 
     guard let ciCropped = self.crop(ciTranslated) else {print("Error cropping.");return} 
     guard let final = context.createCGImage(ciCropped, from: ciCropped.extent) else {print("Error on CG gen.");return} 
이 예에

func translation(image: CIImage, x: CGFloat, y: CGFloat) -> CIImage?{ 
    guard let filter = CIFilter(name: "CIAffineTransform") else {print("Unable to generate filter"); return nil} 
    let translate = CGAffineTransform.init(translationX: x, y: y) 
    filter.setValue(image, forKey: "inputImage") 
    filter.setValue(translate, forKey: "inputTransform") 
    return filter.outputImage 
} 

최종 호출