Sto modificando le foto tramite PhotoKit ma ho scoperto che questo non preserva i metadati della foto originale. Ciò si verifica anche con SamplePhotosApp fornito da Apple quando applicano i filtri Seppia o Chrome. La mia domanda è, come si fa a garantire che tutti i metadati della foto originale vengano conservati?Come conservare i metadati delle foto originali durante la modifica di PHAssets?
Ho scoperto come è possibile ottenere i metadati dell'immagine originale e sono riuscito a salvare i metadati nell'ultimo CIImage
che ho creato, ma viene comunque rimosso quando viene eseguita la modifica. Ci deve essere un problema nel modo in cui converto lo CIImage
in uno CGImage
in uno UIImage
in NSData
, o come lo sto scrivendo su disco.
asset.requestContentEditingInputWithOptions(options) { (input: PHContentEditingInput!, _) -> Void in
//Get full image
let url = input.fullSizeImageURL
let orientation = self.input.fullSizeImageOrientation
var inputImage = CIImage(contentsOfURL: url)
inputImage = inputImage.imageByApplyingOrientation(orientation)
//do some processing on original photo here and create a CGImage...
//save the original photo's metadata to a new CIImage:
let originalMetadata = inputImage.properties()
let newImage = CIImage(CGImage: editedCGImage, options: [kCIImageProperties: originalMetadata])
println(newImage.properties()) //correctly prints all metadata!
//commit changes to disk - somewhere after this line the metadata is lost
let eaglContext = EAGLContext(API: .OpenGLES2)
let ciContext = CIContext(EAGLContext: eaglContext)
let outputImageRef = ciContext.createCGImage(newImage, fromRect: newImage.extent())
let uiImage = UIImage(CGImage: outputImageRef, scale: 1.0, orientation: UIImageOrientation.Up)
let jpegNSData = UIImageJPEGRepresentation(uiImage, 0.75)
let contentEditingOutput = PHContentEditingOutput(contentEditingInput: input)
let success = jpegData.writeToURL(contentEditingOutput.renderedContentURL, options: NSDataWritingOptions.AtomicWrite, error: _)
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)') }
})
})
originale - notare la scheda GPS:
Dopo aver modificato la foto:
Questo è probabilmente un bug, come hai sottolineato, 'properties' dovrebbe sempre restituire i metadati dall'immagine di input ** originale **. Sto lavorando per convertire il tuo codice in Swift, sembra promettente. – Joey
Sei riuscito a portarlo su Swift? –
Hm, sto trovando l'unico oggetto in 'metadata' è Filesize = #. – Joey