2015-04-19 16 views
10

Uso CIFilters per convertire un'immagine in scala di grigi e applicare alcuni effetti di elaborazione delle immagini. La visualizzazione dell'output in un UIImageView funziona; l'immagine viene visualizzata ed è stata modificata come previsto.UIImageJPEGRappresentazione restituisce nil

Tuttavia, chiamare UIImageJPEGRepresentation sembra non restituire dati - ogni volta. Non funziona mai. Chiamare UIImageJPEGRappresentazione utilizzando l'immagine a colori originale funziona correttamente.

Cosa sta succedendo qui? Perché la conversione jpeg potrebbe non riuscire quando viene visualizzata l'immagine? Non vengono generate eccezioni (impostazione di un punto di interruzione di eccezione, non viene colpito) e nessun messaggio viene visualizzato nella console.

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!? 

Edit: Ecco il codice di lavoro, sulla base di Arbitur's answer:

// 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) 
    } 
+1

Qual è 'ret' in' UIImageJPEGRepresentation (RET, 1.0) '? Non riesco a vedere dove è definito nel tuo codice. –

+0

Errore di copia/incolla nella domanda. Modificato. – stone

+1

Provare prima a creare un CGImage e poi a UIImage. Ho avuto questo problema con CIImage prima. – Arbitur

risposta

9

Ive ha avuto il problema prima con CIImage e di lavorare in giro che ho fatto un CGImage con il CIImage e poi un UIImmagine con CGImage.

+6

Suggerimento: la tua risposta potrebbe essere migliorata pubblicando il codice necessario per raggiungere questo obiettivo. – oarfish

15

UIImageJPEGRepresentation sembra utilizzare la proprietà CGImage dello UIImage. Il problema è che quando si inizializza lo UIImage con un CIImage, quella proprietà è nil.

La mia soluzione era quella di aggiungere seguente blocco prima della chiamata UIImageJPEGRepresentation:

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

    image = UIImage(CGImage: cgImage) 
} 
+1

Fantastico, funziona come un fascino. Non sono sicuro che sarei mai incappato nella proprietà CIImage nullo. – jcaruso

0

La risposta da Daniel sta lavorando molto. Di seguito la sua risposta è stata convertita per l'utilizzo in 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) 
    } 
Problemi correlati