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)
}
Qual è 'ret' in' UIImageJPEGRepresentation (RET, 1.0) '? Non riesco a vedere dove è definito nel tuo codice. –
Errore di copia/incolla nella domanda. Modificato. – stone
Provare prima a creare un CGImage e poi a UIImage. Ho avuto questo problema con CIImage prima. – Arbitur