ios swift uiimage cifilter

ios - UIImageJPEGRepresentation devuelve nil



swift cifilter (3)

He tenido el problema antes con CIImage y, para solucionarlo, hice una CGImage con el CIImage y luego una UIImage con la CGImage.

Estoy usando CIFilters para convertir una imagen a escala de grises y aplicar algunos efectos de procesamiento de imágenes. La visualización de la salida en un UIImageView funciona; La imagen se muestra y se ha modificado como se esperaba.

Sin embargo, la llamada UIImageJPEGRepresentation parece no devolver datos, cada vez. Nunca funciona Llamar a UIImageJPEGRepresentación usando la imagen de color original funciona bien.

¿Que está pasando aqui? ¿Por qué podría fallar la conversión jpeg cuando la visualización de la imagen funciona bien? No se producen excepciones (establecer un punto de interrupción de excepción, no se encuentra) y no aparecen mensajes en la consola.

let _cicontext = CIContext(options:nil) // Set up grayscale and blur filters: let grayIze = CIFilter(name: "CIColorControls") let blur = CIFilter(name: "CIGaussianBlur") grayIze.setValue(0, forKey:kCIInputSaturationKey) grayIze.setValue(0.5, forKey: kCIInputBrightnessKey) blur.setValue(4, forKey: kCIInputRadiusKey) // Go! let originalImage = CIImage(image: colorImageThatDefinitelyExists) grayIze.setValue(originalImage, forKey: kCIInputImageKey) blur.setValue(grayIze.outputImage, forKey: kCIInputImageKey) let output = UIImage(CIImage: blur.outputImage) let imageData: NSData? = UIImageJPEGRepresentation(output, 1.0) // Returns nil!?

Edición: Aquí está el código de trabajo, basado en la respuesta de Arbitur :

// Define an image context at the class level, which will only be initialized once: static let imageContext = CIContext(options:nil) // And here''s the updated code in a function: class func convertToGrayscale(image: UIImage)->UIImage? { // Set up grayscale and blur filters: let filter1_grayIze = CIFilter(name: "CIColorControls") let filter2_blur = CIFilter(name: "CIGaussianBlur") filter1_grayIze.setValue(0, forKey:kCIInputSaturationKey) filter1_grayIze.setValue(0.5, forKey: kCIInputBrightnessKey) filter2_blur.setValue(4, forKey: kCIInputRadiusKey) // Go! let originalImage = CIImage(image: image) filter1_grayIze.setValue(originalImage, forKey: kCIInputImageKey) filter2_blur.setValue(filter1_grayIze.outputImage, forKey: kCIInputImageKey) let outputCIImage = filter2_blur.outputImage let temp:CGImageRef = imageContext.createCGImage(outputCIImage, fromRect: outputCIImage.extent()) let ret = UIImage(CGImage: temp) return ret } // And finally, the function call: if let grayImage = ProfileImage.convertToGrayscale(colorImage) { let imageData: NSData? = UIImageJPEGRepresentation(grayImage, 1.0) }


La respuesta de Daniel está funcionando muy bien. A continuación su respuesta se convirtió para usar en Swift4.

Swift4

if image?.cgImage == nil { guard let ciImage = image?.ciImage, let cgImage = CIContext(options: nil).createCGImage(ciImage, from: ciImage.extent) else { return } image = UIImage(cgImage: cgImage) }


UIImageJPEGRepresentation parece usar la propiedad CGImage de UIImage . El problema es que al inicializar UIImage con un CIImage , esa propiedad es nil .

Mi solución fue agregar el siguiente bloque antes de la llamada UIImageJPEGRepresentation :

(última actualización Swift 4)

if image.cgImage == nil { guard let ciImage = image.ciImage, let cgImage = CIContext(options: nil).createCGImage(ciImage, from: ciImage.extent) else { return nil } image = UIImage(cgImage: cgImage) }