2015-06-04 7 views
7

Ich entwickle eine App, mit der Benutzer Fotos mit PhotoKit bearbeiten können. Ich habe das bearbeitete Foto zuvor als JPEG auf der Festplatte gespeichert. Ich würde es gerne vermeiden, zu JPEG zu konvertieren und habe die Modifikationen implementiert, um das zu tun. Es funktioniert hervorragend für Fotos, die mit der Kamera aufgenommen wurden, aber wenn Sie versuchen, einen Screenshot zu bearbeiten, schlägt der PHPhotoLibrary.sharedPhotoLibrary().performChanges Block fehl und protokolliert The operation couldn’t be completed. (Cocoa error -1.). Ich bin mir nicht sicher, warum dies dazu führt, dass der performChanges-Block fehlschlägt. Was habe ich hier falsch gemacht?Bildschirmfotos können nicht bearbeitet werden, performChanges-Block schlägt fehl

Ich habe eine sample app available to download erstellt, die das Problem demonstriert, und ich habe den entsprechenden Code unten eingefügt. Die App versucht, das neueste Foto in Ihrer Fotobibliothek zu bearbeiten. Wenn dies erfolgreich ist, werden Sie aufgefordert, das Foto zu bearbeiten. Andernfalls passiert nichts und Sie sehen das Konsolenprotokoll. Um das Problem zu reproduzieren, machen Sie einen Screenshot und starten Sie die App.

Aktuelle Code, der mit Screenshots funktioniert:

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 
} 

Code Replacement, die Screenshots zum Scheitern verurteilt Ursachen:

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

Antwort

0

Das Problem aufgrund der Tatsache geschieht, dass eingestellte Fotos werden immer als JPG-Dateien gespeichert, und Screenshots sind in der Tat PNG-Dateien.

Es fiel mir ein, während ich Ihr Beispielprojekt wurde das Debuggen und sah das in der Photoeditor, contentEditingOutput.renderedContentURL ist eine URL zu einem JPG, während, wenn Sie das Ergebnis CGImageSourceGetType(imageSource) untersuchen klar ist, das es ist ein PNG (liefert eine PNG UTI : public.png).

Also ich ging und lese die documentation für renderedContentURL, die besagt, dass, wenn ein Foto Asset bearbeiten, das veränderte Bild im JPEG-Format geschrieben wird - was eindeutig nicht funktioniert, wenn Ihr Bild ein PNG ist. Das führt mich zu der Annahme, dass Apple die Bearbeitung von PNG-Dateien nicht unterstützt oder nicht möchte. Go figure ..

+0

Ich habe einen Fehler mit Apple protokolliert. Dieser Fehler existiert auch in iOS 9 und 10. Offensichtlich keine hohe Priorität für sie zu beheben. – jjxtra

Verwandte Themen