在我的应用中,我试图使图像数据具有元数据(位置,时间戳等)。我正在使用UIImagePickerController进行图像捕获,并且其委托函数具有:
info[UIImagePickerController.InfoKey.originalImage]
info[UIImagePickerController.InfoKey.phAsset]
info[UIImagePickerController.InfoKey.mediaMetadata]
因此,对于从库.phAsset
中拾取的图像而言,它具有我所需的一切。我只是使用.getDataFromPHAsset
函数来获取丰富的数据。但是,对于刚拍摄的图像.phAsset
为零。我考虑过尝试以某种方式将.originalImage
和.mediaMetadata
组合成单个Data对象,但是无法获得所需的结果。我尝试使用这种方法:https://gist.github.com/kwylez/a4b6ec261e52970e1fa5dd4ccfe8898f
我知道我也可以使用AVCaptureSession
创建自定义imageCapture控制器,并在AVCapturePhoto
委托调用中使用.fileDataRepresentation()
函数didFinishProcessingPhoto
,但这不是我的首选。 / p>
任何帮助都将受到高度赞赏。
答案 0 :(得分:1)
我很确定mediaMetadata将没有位置信息。使用此CLLocation extension.
然后使用下面的功能将元数据添加到图像数据:
func addImageProperties(imageData: Data, properties: NSMutableDictionary) -> Data? {
let dict = NSMutableDictionary()
dict[(kCGImagePropertyGPSDictionary as String)] = properties
if let source = CGImageSourceCreateWithData(imageData as CFData, nil) {
if let uti = CGImageSourceGetType(source) {
let destinationData = NSMutableData()
if let destination = CGImageDestinationCreateWithData(destinationData, uti, 1, nil) {
CGImageDestinationAddImageFromSource(destination, source, 0, dict as CFDictionary)
if CGImageDestinationFinalize(destination) == false {
return nil
}
return destinationData as Data
}
}
}
return nil
}
用法:
if let imageData = image.jpegData(compressionQuality: 1.0), let metadata = locationManager.location?.exifMetadata() {
if let newImageData = addImageProperties(imageData: imageData, properties: metadata) {
// newImageData now contains exif metadata
}
}