Sto sviluppando un'applicazione che consente agli utenti di modificare le foto utilizzando PhotoKit. Stavo salvando la foto modificata su disco come JPEG. Vorrei evitare la conversione in JPEG e ho implementato le modifiche per farlo. Funziona perfettamente per le foto scattate con la fotocamera, ma se si tenta di modificare uno screenshot, il blocco PHPhotoLibrary.sharedPhotoLibrary().performChanges
non riuscirà e il registro The operation couldn’t be completed. (Cocoa error -1.)
. Non sono sicuro del motivo per cui ciò sta causando il fallimento del blocco performChanges, cosa ho fatto di sbagliato qui?Impossibile modificare gli screenshot, il blocco performChanges non riesce
Ho creato un sample app available to download che dimostra il problema e ho incluso il codice pertinente di seguito. L'app tenta di modificare la foto più recente nella libreria fotografica. Se riesce, verrà richiesto l'accesso per modificare la foto, altrimenti non accadrà nulla e vedrai il log della console. Per riprodurre il problema, fai uno screenshot e poi avvia l'app.
codice corrente che funziona con le immagini: il codice
let jpegData: NSData = outputPhoto.jpegRepresentationWithCompressionQuality(0.9)
let contentEditingOutput = PHContentEditingOutput(contentEditingInput: self.input)
var error: NSError?
let success = jpegData.writeToURL(contentEditingOutput.renderedContentURL, options: NSDataWritingOptions.AtomicWrite, error: &error)
if success {
return contentEditingOutput
} else {
return nil
}
sostituzione che causa le immagini a fallire:
let url = self.input.fullSizeImageURL
let orientation = self.input.fullSizeImageOrientation
var inputImage = CIImage(contentsOfURL: url)
inputImage = inputImage.imageByApplyingOrientation(orientation)
let outputPhoto = createOutputImageFromInputImage(inputImage)!
let originalImageData = NSData(contentsOfURL: self.input.fullSizeImageURL)!
let imageSource = CGImageSourceCreateWithData(originalImageData, nil)
let dataRef = CFDataCreateMutable(nil, 0)
let destination = CGImageDestinationCreateWithData(dataRef, CGImageSourceGetType(imageSource), 1, nil) //getType automatically selects JPG, PNG, etc based on original format
struct ContextStruct {
static var ciContext: CIContext? = nil
}
if ContextStruct.ciContext == nil {
let eaglContext = EAGLContext(API: .OpenGLES2)
ContextStruct.ciContext = CIContext(EAGLContext: eaglContext)
}
let cgImage = ContextStruct.ciContext!.createCGImage(outputPhoto, fromRect: outputPhoto.extent())
CGImageDestinationAddImage(destination, cgImage, nil)
if CGImageDestinationFinalize(destination) {
let contentEditingOutput = PHContentEditingOutput(contentEditingInput: self.input)
var error: NSError?
let imageData: NSData = dataRef
let success = imageData.writeToURL(contentEditingOutput.renderedContentURL, options: .AtomicWrite, error: &error)
if success {
//it does succeed
return contentEditingOutput
} else {
return nil
}
}
Ho riscontrato un bug con Apple. Questo bug esiste anche in iOS 9 e 10. Ovviamente non è una priorità elevata da risolvere. – jjxtra