Я пытаюсь написать фото-приложение, которое может принимать изображения как в формате RAW, так и в формате JPEG, и сохранять их в фотоаппарате. Функции jpegPhotoDataRepresentation и dngPhotoDataRepresentation, похоже, являются ключом ко всем примерам, которые я нашел, однако оба они устарели в iOS 11, и функция сохранения после «capturePhoto» теперь
func photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?) {
Главный пример, который мне удалось найти для работающего приложения RAW iOS11:
https://ubunifu.co/swift/raw-photo-capture-sample-swift-4-ios-11
который работает, однако он снимает только RAW, а сохранение неуклюже, потому что его нет в списке.
Я изменил настройки фотографии, чтобы разрешить как необработанный, так и обработанный снимок с этой строкой
photoSettings = AVCapturePhotoSettings(rawPixelFormatType: availableRawFormat.uint32Value, processedFormat: [AVVideoCodecKey : AVVideoCodecType.jpeg])
Но как только я действительно сделал снимок, я понятия не имею, как получить доступ к данным обработанного формата. fileDataRepresentation, кажется, единственный способ получить доступ к материалу dng, но нет никакого способа получить в jpeg отдельно? Код, который я нашел в Apple до iOS11, предлагает использовать PHPhotoLibrary и добавить ресурс, но для этого требуется представление данных, к которому я не могу получить доступ, кроме как в виде файла dng, который при сохранении в библиотеке просто белый, потому что библиотека не может обрабатывать файлы RAW. Вот мой код photoOutput на случай, если это поможет.
func photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?) {
let dir = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first! as String
let formatter = DateFormatter()
formatter.dateFormat = "yyyyMMddHHmmss"
formatter.locale = Locale.init(identifier: "en_US_POSIX")
let filePath = dir.appending(String(format: "/%@.dng", formatter.string(from: Date())))
let dngFileURL = URL(fileURLWithPath: filePath)
let dngData = photo.fileDataRepresentation()!
do {
try dngData.write(to: dngFileURL, options: [])
} catch {
print("Unable to write DNG file.")
return
}
PHPhotoLibrary.shared().performChanges( {
let creationRequest = PHAssetCreationRequest.forAsset()
let creationOptions = PHAssetResourceCreationOptions()
creationOptions.shouldMoveFile = true
//dngData is the problem, this should be the jpeg representation
creationRequest.addResource(with: .photo, data: dngData, options: nil)
//This line works fine, the associated file is the correct RAW file, but the jpeg preview is garbage
creationRequest.addResource(with: .alternatePhoto, fileURL: dngFileURL, options: creationOptions)
}, completionHandler: nil)
}