2015-06-04 9 views
7

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

Odpowiedz

0

Problem dzieje się ze względu na fakt, że skorygowane zdjęcia są zawsze zapisywane jako pliki JPG, a zrzuty ekranu są w rzeczywistości plikami PNG.

Przyszło mi do głowy, kiedy byłem debugowania przykładowy projekt i zobaczył w Photoeditor, contentEditingOutput.renderedContentURL jest URL do JPG, natomiast jeśli bada wynik CGImageSourceGetType(imageSource) to jest jasne, że jest to PNG (zwraca PNG ZUM : public.png).

Poszedłem i przeczytałem documentation dla renderedContentURL, który stwierdza, że ​​jeśli edytujesz zdjęcie, zmieniony obraz jest zapisany w formacie JPEG - co oczywiście nie zadziała, jeśli obraz jest PNG. To prowadzi mnie do myślenia, że ​​Apple nie obsługuje edycji plików PNG lub nie chcesz. Idź rysunek ..

+0

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

Powiązane problemy