Можете ли вы сохранить отредактированный файл RAW .dng на iOS?
Я хочу создать приложение для iOS 10, которое позволит вам снимать RAW (.dng
) изображение, отредактируйте его, а затем сохраните отредактированное .dng
файл в камеру рулона. Сочетая код из примеров приложений AppleAVCamManual2016 иRawExpose, я дошел до того, что у меня есть CIFilter
содержащий изображение RAW вместе с правками.
Тем не менее, я не могу понять, как сохранить результат CIImage
к камере катиться как .dng
файл. Это возможно?
4 ответа
Файл RAW является "необработанным" выводом непосредственно с датчика камеры, поэтому единственный способ получить его - непосредственно с камеры. После обработки файла RAW то, что у вас есть, по определению больше не является "сырым", поэтому вы не можете вернуться к RAW.
Чтобы расширить метафору, представленную на WWDC, где они представили фотографии в формате RAW... файл RAW подобен ингредиентам для торта. Когда вы используете Core Image для создания видимого изображения из файла RAW, вы выпекаете торт. (И, как уже отмечалось, есть много разных способов выпекать пирог из одних и тех же ингредиентов, соответствующих возможным вариантам обработки RAW.) Но вы не можете разогреть пирог - нет возврата к оригинальным ингредиентам, тем более способ, который каким-то образом сохраняет результат вашей обработки.
Таким образом, единственный способ сохранить изображение, обработанное из оригинала RAW, - это сохранить обработанное изображение в формате растрового изображения. (Используйте JPEG, если вы не против сжатия с потерями, PNG или TIFF, если вам нужно без потерь и т. Д.)
Если вы пишете результаты редактирования вPHPhotoLibrary
, используйте JPEG (высокое качество / менее сжатый, если хотите), и Фото сохранит ваши изменения в качестве производного результата, что позволит пользователю вернуться к оригиналу RAW. Вы также можете описать набор фильтров, которые вы применили в PHAdjustmentData
сохраненный с вашим редактированием - с данными настройки, другой экземпляр вашего приложения (или расширение приложения "Фото") может восстановить редактирование с использованием исходных данных RAW плюс сохраненные вами настройки фильтра, а затем позволить пользователю изменять параметры фильтра для создания другого обработанного образ.
Примечание. Существует версия формата DNG под названием Linear DNG, которая поддерживает изображения не-RAW (или "не совсем RAW"), но на практике это довольно редко, и стек изображений Apple не поддерживает ее.
К сожалению, DNG не поддерживается в качестве выходного формата в платформе Apple ImageIO. Посмотрите выходные данные CGImageDestinationCopyTypeIdentifiers() для списка поддерживаемых типов вывода:
(
"public.jpeg",
"public.png",
"com.compuserve.gif",
"public.tiff",
"public.jpeg-2000",
"com.microsoft.ico",
"com.microsoft.bmp",
"com.apple.icns",
"com.adobe.photoshop-image",
"com.adobe.pdf",
"com.truevision.tga-image",
"com.sgi.sgi-image",
"com.ilm.openexr-image",
"public.pbm",
"public.pvr",
"org.khronos.astc",
"org.khronos.ktx",
"com.microsoft.dds",
"com.apple.rjpeg"
)
Этот ответ приходит поздно, но он может помочь другим с этой проблемой. Так я сохранил необработанную фотографию в фотопленке в виде файла.dng.
Просто чтобы отметить, я сделал снимок с помощью камеры с AVFoundation.
import Photos
import AVFoundation
//reading in the photo data in as a data object
let photoData = AVCapturePhotoOutput.dngPhotoDataRepresentation(forRawSampleBuffer: sampleBuffer, previewPhotoSampleBuffer: previewPhotoSampleBuffer)
// put it into a temporary file
let temporaryDNGFileURL = NSURL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent("temp.dng")!
try! photoData?.write(to: temporaryDNGFileURL)
// get access to photo library
PHPhotoLibrary.requestAuthorization { status in
if status == .authorized {
// Perform changes to the library
PHPhotoLibrary.shared().performChanges({
let options = PHAssetResourceCreationOptions()
options.shouldMoveFile = true
//Write Raw:
PHAssetCreationRequest.forAsset().addResource(with: .photo, fileURL: temporaryDNGFileURL, options: options)
}, completionHandler: { success, error in
if let error = error { print(error) }
})
}
else { print("cant access photo album") }
}
Надеюсь, поможет.
На момент написания этого ответа (iOS 10.1) единственный способ получить данные DNG:
AVCapturePhotoOutput.dngPhotoDataRepresentation(forRawSampleBuffer: CMSampleBuffer, previewPhotoSampleBuffer: CMSampleBuffer?)
Отмечая, что OP относится к Core Image. Как упоминал Рикстер, CI работает с обработанными данными изображения, поэтому предлагает только результаты обработанного изображения (JPEG, TIFF):
CIContext.writeJPEGRepresentation(of:to:colorSpace:options:)
CIContext.writeTIFFRepresentation(of:to:format:colorSpace:options:)