Zajmuję się tworzeniem aplikacji, która umożliwia użytkownikom edytowanie zdjęć przy użyciu programu PhotoKit. Poprzednio zapisywałem edytowane zdjęcie na dysk jako JPEG. Chciałbym uniknąć konwersji do JPEG i wdrożyłem modyfikacje, aby to zrobić. Działa doskonale w przypadku zdjęć wykonanych aparatem, ale jeśli spróbujesz edytować zrzut ekranu, blok PHPhotoLibrary.sharedPhotoLibrary().performChanges
zakończy się niepowodzeniem i zaloguj się The operation couldn’t be completed. (Cocoa error -1.)
. Nie jestem pewien, dlaczego powoduje to blokowanie performChanges, co ja tu zrobiłem źle?Nie można edytować zrzutów ekranu, okno performChanges ulega awarii
Utworzyłem kod sample app available to download, który demonstruje problem i dołączyłem odpowiedni kod poniżej. Aplikacja próbuje edytować najnowsze zdjęcie w bibliotece zdjęć. Jeśli się powiedzie, poprosi o dostęp do edycji zdjęcia, w przeciwnym razie nic się nie stanie i zobaczysz dziennik konsoli. Aby odtworzyć problem, zrób zrzut ekranu, a następnie uruchom aplikację.
Aktualny kod, który współpracuje ze screenów: Kod
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
}
zastępczą, która powoduje screeny na niepowodzenie:
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
}
}
Zalogowałem błąd w Apple. Ten błąd występuje również w iOS 9 i 10. Oczywiście nie jest to dla nich priorytetem. – jjxtra