2015-06-04 7 views
7

Я разрабатываю приложение, которое позволяет пользователям редактировать фотографии с помощью PhotoKit. Я ранее сохранял отредактированную фотографию на диск как JPEG. Я хотел бы избежать преобразования в JPEG и внедрил модификации для этого. Он отлично работает для фотографий, сделанных с помощью камеры, но если вы попытаетесь отредактировать скриншот, произойдет сбой блока PHPhotoLibrary.sharedPhotoLibrary().performChanges и войдите в систему The operation couldn’t be completed. (Cocoa error -1.). Я не уверен, почему это заставляет блок executeChanges сбой, что я сделал неправильно здесь?Невозможно отредактировать скриншоты, выполнить блок блоков изменения не удается

Я создал sample app available to download, который демонстрирует проблему, и я включил соответствующий код ниже. Приложение пытается отредактировать самую новую фотографию в вашей фотобиблиотеке. Если он преуспеет, он предложит получить доступ к редактированию фотографии, иначе ничего не произойдет, и вы увидите журнал консоли. Чтобы воспроизвести проблему, запустите скриншот, затем запустите приложение.

Текущий код, который работает со скриншотами:

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 
} 

Замена кода, который вызывает скриншоты на провал:

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

ответ

0

Проблема происходит из-за того, что скорректированные фотографии всегда сохраняются в формате JPG файлы, и скриншоты - это фактически файлы PNG.

Это произошло со мной, когда я отладки проекта образец и увидел в фоторедактор, contentEditingOutput.renderedContentURL является URL в JPG, а если вы исследуете результат CGImageSourceGetType(imageSource) это ясно, это PNG (возвращает PNG ИМП : public.png).

Итак, я пошел и прочитал documentation для renderedContentURL, в котором говорится, что при редактировании фотообъекта измененное изображение записывается в формате JPEG, что явно не сработает, если ваше изображение является PNG. Это заставляет меня думать, что Apple не поддерживает редактирование PNG-файлов или не хочет вас. Go figure.

+0

Я зарегистрировал ошибку с Apple. Эта ошибка существует и в iOS 9 и 10. Очевидно, что для них не требуется высокий приоритет. – jjxtra

 Смежные вопросы

  • Нет связанных вопросов^_^