2017-02-02 19 views
2

Я пишу приложение, которое считывает DNG файлы из моего Ricoh GR II и сохранить их прошивкой 10 фото библиотеки, код, как этотСохранение DNG (необработанные фотографии), сделанные на другой камере для IOS Photo Library

let photoLibrary = PHPhotoLibrary.shared() 
photoLibrary.performChanges({ 
    PHAssetChangeRequest.creationRequestForAsset(from: image) 
}) { (success: Bool, error: Error?) -> Void in 
    if success { 
     print("Saving photo ok") 
    } else { 
     print("Error writing to photo library: \(error!.localizedDescription)") 
    } 
} 

И Я получил ошибку ниже:

ImageIO: PluginForUTType:316: file format 'com.adobe.raw-image' doesn't support writing 
Error writing to photo library: The operation couldn’t be completed. (Cocoa error -1.) 

Возможно, iOS поддерживает только DNG, который сделан на iPhone?

ответ

1

PHAssetChangeRequest.creationRequestForAsset(from: image) начинается с UIImage, поэтому в любом случае он не получит исходный файл в вашу библиотеку. A UIImage - отображаемый результат считывания и декодирования файла изображения; к тому времени, когда у вас есть UIImage, он не знает, поступал ли он из JPEG или DNG или GIF или был отображен во время выполнения через CGBitmapContext или что-то еще. Когда вы пытаетесь сохранить с помощью creationRequestForAssetFromImage:, вы берете этот конечный результат и возвращаете его обратно в файл - любой тип файла, который хочет этот метод. (Возможно, JPEG.)

Если вы хотите поместить фактический файл DNG в библиотеку фотографий, вам необходимо использовать метод фреймворка Photos, который принимает оригинальные файлы, а не декодированные изображения. Кроме того, поскольку не каждый клиент Фотографии может иметь дело с RAW DNG, фотографии требуют, чтобы каждый DNG-файл, который вы помещали в библиотеку, сопровождался представлением JPEG, которое может видеть приложения, не поддерживающие RAW (к сожалению, включая приложение «Фотографии»).

К счастью, для этого есть API.

PHPhotoLibrary.shared().performChanges({ 
    let creationRequest = PHAssetCreationRequest.forAsset() 
    let creationOptions = PHAssetResourceCreationOptions() 
    creationOptions.shouldMoveFile = true 
    creationRequest.addResource(with: .photo, data: jpegData, options: nil) 
    creationRequest.addResource(with: .alternatePhoto, fileURL: dngFileURL, options: creationOptions) 
}, completionHandler: completionHandler) 

PHAssetCreationRequest для создания активов из основных ресурсов - один или несколько файлов изображений, видео файлов, некоторые их комбинации (для живых фотографий) и т.д. photo и alternatePhoto ресурсов, как вы предоставите файл DNG и его сопровождающий просмотр в формате JPEG. И опция shouldMoveFile хороша для того, если вы не хотите взорвать ваше устройство от , копируя файл из песочницы вашего приложения в хранилище библиотеки фотографий - хорошо для больших ресурсов, таких как DNG и видео 4K.

(Фрагмент кода из Apple's Photo Capture guide.)


Тем не менее, в то время как RAW обработки от Apple поддерживает изображения с all sorts of third-party cameras, он не похож на их список включает в себя любые модели Ricoh. (Не даже this kind.) .)

Это не мешает вам хранить Ricoh DNG в библиотеке Photos, но это означает, что единственные приложения, которые смогут с пользой прочитать их из библиотеки, нуждаются в их собственном Ricoh RAW поддержку обработки, чтобы увидеть что-либо, кроме предварительного просмотра JPEG.