Próbuję zapisać NIEKTÓRE z metadanych z bufora próbki obrazu wraz z obrazem.Swift: Niestandardowe metadane zapisywania kamery z obrazem
muszę:
- Obracanie obrazu w orientacji z metadanych
- Usuń orientację z metadanych
- zapisać daty pobranej z metadanych
- Zapisz tego obrazu z metadanych do katalogu dokumentów:
Próbowałem utworzyć UIImage z danych, ale to usuwa metadane. Próbowałem użyć CIImage z danych, które zachowuje metadane, ale nie mogę go obrócić, a następnie zapisać go do pliku.
private func snapPhoto(success: (UIImage, CFMutableDictionary) -> Void, errorMessage: String -> Void) {
guard !self.stillImageOutput.capturingStillImage,
let videoConnection = stillImageOutput.connectionWithMediaType(AVMediaTypeVideo) else { return }
videoConnection.fixVideoOrientation()
stillImageOutput.captureStillImageAsynchronouslyFromConnection(videoConnection) {
(imageDataSampleBuffer, error) -> Void in
guard imageDataSampleBuffer != nil && error == nil else {
errorMessage("Couldn't snap photo")
return
}
let data = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(imageDataSampleBuffer)
let metadata = CMCopyDictionaryOfAttachments(nil, imageDataSampleBuffer, CMAttachmentMode(kCMAttachmentMode_ShouldPropagate))
let metadataMutable = CFDictionaryCreateMutableCopy(nil, 0, metadata)
let utcDate = "\(NSDate())"
let cfUTCDate = CFStringCreateCopy(nil, utcDate)
CFDictionarySetValue(metadataMutable!, unsafeAddressOf(kCGImagePropertyGPSDateStamp), unsafeAddressOf(cfUTCDate))
guard let image = UIImage(data: data)?.fixOrientation() else { return }
CFDictionarySetValue(metadataMutable, unsafeAddressOf(kCGImagePropertyOrientation), unsafeAddressOf(1))
success(image, metadataMutable)
}
}
Oto mój kod do zapisania obrazu.
func saveImageAsJpg(image: UIImage, metadata: CFMutableDictionary) {
// Add metadata to image
guard let jpgData = UIImageJPEGRepresentation(image, 1) else { return }
jpgData.writeToFile("\(self.documentsDirectory)/image1.jpg", atomically: true)
}
Jestem zakładając, że mogę dostać 'filePath' od' NSSearchPathForDirectoriesInDomains (.DocumentDirectory, .UserDomainMask, true) .first! + "name.png" '. Ale czym jest "fileService"? Czy 'fileService' jest niestandardową klasą? –
@ Carlos.V 'fileService' jest niestandardową klasą, którą stworzyłem aby owinąć' NSFileManager' i ułatwić mi życie. – SeanRobinson159
Jestem w stanie odczytać rzeczywiste metadane i zmodyfikować je, ale nie mogę zapisać nowej meta do pliku. Czy możesz wyjaśnić nieco, w jaki sposób działa funkcja '.save()', spróbowałem użyć 'fileMan.createFileAtPath (filePath, zawartość: finalData, atrybuty: metadane jako! [String: AnyObject])' ale nie zapisuje metadane, dotyczy innych atrybutów. Być może używasz 'PHPhotoLibrary'? Myślę, że próbuję w ten sposób, ale nie jestem pewien, czy to zadziała w 100%. –