swift uiimage ciimage uiimagejpegrepresentation uiimagepngrepresentation

swift - La representación PNG/JPEG de CIImage siempre devuelve nil



uiimage uiimagejpegrepresentation (1)

Simplemente comience un nuevo contexto gráfico y dibuje su imagen en escala de grises allí:

func blackWhiteImage(image: UIImage) -> Data? { guard let ciImage = CIImage(image: image)?.applyingFilter("CIColorControls", parameters: [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 redraw.pngData() // Swift 4.2 Xcode 10 or later // return UIImagePNGRepresentation(redraw) Swift 4.1 - Xcode lower than 10 }

También puede extender UIImage para devolver una imagen en escala de grises:

extension UIImage { var grayscale: UIImage? { guard let ciImage = CIImage(image: self)?.applyingFilter("CIColorControls", parameters: [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 = grayscale.pngData() { // or Swift 4.1 or earlier -> let data = UIImagePNGRepresentation(grayscale) print(data.count) // 689035 }

Actualmente estoy haciendo una aplicación de edición de fotos.

Cuando el usuario selecciona una foto, se convierte automáticamente en blanco y negro con este código:

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)! }

El problema que tengo con este código es que sigo recibiendo este error:

fatal error: unexpectedly found nil while unwrapping an Optional value

He tenido mi código en una configuración ligeramente diferente, pero aún así se rompe cuando llega a la UIImagePNG/JPEGRepresentation(xx) .

¿Hay alguna forma de obtener los datos PNG o JPEG de un CIImage para usar en una vista de imagen / solo UIImage en general?

Cualquiera de los otros métodos no entra en suficiente detalle para saber qué código debe usarse.