2015-06-04 22 views
7

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

risposta

0

Il problema si verifica a causa del fatto che le foto regolati vengono sempre salvati come file JPG, e gli screenshot sono in effetti file PNG.

Mi venne in mente mentre ero il debug progetto di esempio e vide la nel PhotoEditor, contentEditingOutput.renderedContentURL è un URL a un JPG, mentre se si esamina il risultato di CGImageSourceGetType(imageSource) è chiaro il che è un PNG (restituisce un PNG UTI : public.png).

Quindi sono andato a leggere il documentation per renderedContentURL in cui si afferma che se si modifica un asset fotografico, l'immagine modificata viene scritta in formato JPEG - che chiaramente non funzionerà se l'immagine è un file PNG. Questo mi porta a pensare che Apple non supporti la modifica dei file PNG o non voglia che tu lo faccia. Vai a ..

+0

Ho riscontrato un bug con Apple. Questo bug esiste anche in iOS 9 e 10. Ovviamente non è una priorità elevata da risolvere. – jjxtra