Я редактирую фотографии с помощью PhotoKit, но обнаружил, что это не сохраняет исходные метаданные фотографии. Это происходит даже с приложением SamplePhotosApp, предоставленным Apple, когда они применяют фильтры Sepia или Chrome. Мой вопрос: как вы гарантируете сохранение всех исходных метаданных фотографий?
Я обнаружил, как можно получить метаданные исходного изображения, и мне удалось сохранить эти метаданные в окончательном CIImage
файле, который я создаю, но он все равно удаляется при фиксации редактирования. Должна быть проблема в том, как я конвертирую CIImage
в CGImage
в UIImage
в NSData
, или как я записываю это на диск.
asset.requestContentEditingInputWithOptions(options) { (input: PHContentEditingInput!, _) -> Void in
//Get full image
let url = input.fullSizeImageURL
let orientation = self.input.fullSizeImageOrientation
var inputImage = CIImage(contentsOfURL: url)
inputImage = inputImage.imageByApplyingOrientation(orientation)
//do some processing on original photo here and create a CGImage...
//save the original photo's metadata to a new CIImage:
let originalMetadata = inputImage.properties()
let newImage = CIImage(CGImage: editedCGImage, options: [kCIImageProperties: originalMetadata])
println(newImage.properties()) //correctly prints all metadata!
//commit changes to disk - somewhere after this line the metadata is lost
let eaglContext = EAGLContext(API: .OpenGLES2)
let ciContext = CIContext(EAGLContext: eaglContext)
let outputImageRef = ciContext.createCGImage(newImage, fromRect: newImage.extent())
let uiImage = UIImage(CGImage: outputImageRef, scale: 1.0, orientation: UIImageOrientation.Up)
let jpegNSData = UIImageJPEGRepresentation(uiImage, 0.75)
let contentEditingOutput = PHContentEditingOutput(contentEditingInput: input)
let success = jpegData.writeToURL(contentEditingOutput.renderedContentURL, options: NSDataWritingOptions.AtomicWrite, error: _)
PHPhotoLibrary.sharedPhotoLibrary().performChanges({ () -> Void in
let request = PHAssetChangeRequest(forAsset: asset)
request.contentEditingOutput = contentEditingOutput
}, completionHandler: { (success: Bool, error: NSError!) -> Void in
if success == false { println('failed to commit image edit: \(error)') }
})
})
Оригинал – обратите внимание на вкладку GPS:
После редактирования фотографии: