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