4

현재 사진 편집 응용 프로그램을 만들고 있습니다. 사진은 사용자가 선택CIImage의 PNG/JPEG 표현은 항상 nil을 반환합니다.

, 자동을 사용하여 흑백으로이 코드로 변환됩니다

:

func blackWhiteImage(image: UIImage) -> Data { 
    print("Starting black & white") 

    let orgImg = CIImage(image: image) 
    let bnwImg = orgImg?.applyingFilter("CIColorControls", withInputParameters: [kCIInputSaturationKey:0.0]) 

    let outputImage = UIImage(ciImage: bnwImg!) 

    print("Black & white complete") 

    return UIImagePNGRepresentation(outputImage)! 
} 

이 코드와 데 문제는 내가이 오류가 계속이다

fatal error: unexpectedly found nil while unwrapping an Optional value 

약간 다른 구성으로 코드를 가지고 있지만, 코드가 UIImagePNG/JPEGRepresentation(xx) 섹션에 도착하면 여전히 손상됩니다.

이미지보기/일반 UIImage에서 사용하기 위해 CIImage에서 PNG 또는 JPEG 데이터를 가져 오는 방법이 있습니까?

다른 모든 방법은 어떤 코드를 사용해야하는지에 대해 충분히 자세히 설명하지 않습니다.

+0

CIImage은 다음과 같습니다 당신은 또한 그레이 스케일 이미지를 반환 할 수있는 UIImage을 확장 할 수 있습니다

func blackWhiteImage(image: UIImage) -> Data? { guard let ciImage = CIImage(image: image)?.applyingFilter("CIColorControls", withInputParameters: [kCIInputSaturationKey:0.0]) else { return nil } UIGraphicsBeginImageContextWithOptions(image.size, false, image.scale) defer { UIGraphicsEndImageContext() } UIImage(ciImage: ciImage).draw(in: CGRect(origin: .zero, size: image.size)) guard let redraw = UIGraphicsGetImageFromCurrentImageContext() else { return nil } return UIImagePNGRepresentation(redraw) } 

이미지가 아닙니다. 이미지를 얻으려면 이미지를 렌더링해야합니다. – matt

+0

중복 된 http://stackoverflow.com/questions/40319229/uiimagepng-representation-from-avfoundation-returns-nil 외 다수 – matt

답변

3

그냥 새로운 그래픽 컨텍스트를 시작하고 거기 그레이 스케일 이미지를 그릴 :

extension UIImage { 
    var grayscale: UIImage? { 
     guard let ciImage = CIImage(image: self)?.applyingFilter("CIColorControls", withInputParameters: [kCIInputSaturationKey: 0]) else { return nil } 
     UIGraphicsBeginImageContextWithOptions(size, false, scale) 
     defer { UIGraphicsEndImageContext() } 
     UIImage(ciImage: ciImage).draw(in: CGRect(origin: .zero, size: size)) 
     return UIGraphicsGetImageFromCurrentImageContext() 
    } 
} 

let profilePicture = UIImage(data: try! Data(contentsOf: URL(string:"http://i.stack.imgur.com/Xs4RX.jpg")!))! 

if let grayscale = profilePicture.grayscale, let data = UIImagePNGRepresentation(grayscale) { 
    print(data.count) // 689035 
}