UIImageJPEGRepresentation gibt nil @ zurü

Ich verwende CIFilter, um ein Bild in Graustufen umzuwandeln und einige Bildverarbeitungseffekte anzuwenden. Das Anzeigen der Ausgabe in einer UIImageView funktioniert; Das Bild wird angezeigt und wurde wie erwartet geändert.

Der Aufruf von UIImageJPEGRepresentation scheint jedoch jedes Mal keine Daten zurückzugeben. Es funktioniert nie Das Aufrufen von UIImageJPEGRepresentation mit dem ursprünglichen Farbbild funktioniert einwandfrei.

Was ist denn hier los? Warum schlägt die JPEG-Konvertierung möglicherweise fehl, wenn das Bild angezeigt wird? Es werden keine Ausnahmen ausgelöst (Festlegen eines Ausnahme-Haltepunkts, der nicht erreicht wird), und in der Konsole werden keine Meldungen angezeigt.

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: Hier ist der Arbeitscode, basierend auf Arbiturs Antwort:

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

Antworten auf die Frage(6)

Ihre Antwort auf die Frage