I use PhotoKit to edit photos, and I need to save the metadata from the original photo. To do this, I save the metadata and then provide it to the options parameter in CGImageDestinationAddImage . I can complete it and write to disk successfully, but when I call performChanges to complete the asset editing, it fails. If instead of nil for options I will do it successfully. What is wrong here?
asset.requestContentEditingInputWithOptions(options) { (input: PHContentEditingInput!, _) -> Void in //get full image let url = input.fullSizeImageURL let inputImage = CIImage(contentsOfURL: url) //get orginal photo metadata let originalImageData = NSData(contentsOfURL: url)! let imageSource = CGImageSourceCreateWithData(originalImageData, nil) let metadata: CFDictionaryRef = CGImageSourceCopyPropertiesAtIndex(imageSource, 0, nil) println(metadata) //prints all the metadata, yay! //do some processing on original photo here and create an output CIImage... //save to disk let dataRef = CFDataCreateMutable(nil, 0) let destination = CGImageDestinationCreateWithData(dataRef, CGImageSourceGetType(imageSource), 1, nil) let eaglContext = EAGLContext(API: .OpenGLES2) let ciContext = CIContext(EAGLContext: eaglContext) let cgImage = ContextStruct.ciContext!.createCGImage(outputPhoto, fromRect: outputPhoto.extent()) CGImageDestinationAddImage(destination, cgImage, metadata) //metadata is problematic - replacing with nil causes it to work if CGImageDestinationFinalize(destination) { let contentEditingOutput = PHContentEditingOutput(contentEditingInput: input) contentEditingOutput.adjustmentData = "something" let imageData: NSData = dataRef let success = imageData.writeToURL(contentEditingOutput.renderedContentURL, options: .AtomicWrite, error: _) if success { PHPhotoLibrary.sharedPhotoLibrary().performChanges({ () -> Void in let request = PHAssetChangeRequest(forAsset: asset) request.contentEditingOutput = contentEditingOutput }, completionHandler: { (success: Bool, error: NSError!) -> Void in if success == false { println('failed to commit image edit: \(error)') } //fails unless metadata is replaced with nil above }) } } })
Error: Error Domain=NSCocoaErrorDomain Code=-1 "The operation couldn't be completed. (Cocoa error -1.)
ios metadata ciimage photokit phasset
Joey
source share