我想捕获图像并添加经度和纬度属性,每个在StackOverflow上可用的示例都尝试了几次,但是不起作用。我使用UIImagePickerController
捕获图像,并使用UIImageWriteToSavedPhotosAlbum
将数据保存到相册
该属性必须如下所示
但是现在我的图像如下所示
答案 0 :(得分:1)
我不知道您到目前为止已经尝试了什么以及您有什么要求,但是根据您的问题,这里有一个将location
设置为image metadata
的示例。
捕获image
后:
/// This is Mohali location for example
let location = CLLocation(latitude: 30.7046, longitude: 76.7179)
/// It will return image metaData including location
let metaData = self.addLocation(location, toImage: image)
/// Saving the image to gallery
self.saveImage(image, withMetadata: metaData)
这是所有必需的方法:
func addLocation(_ location: CLLocation, toImage image: UIImage) -> Dictionary<String, Any> {
/// Initializing the metaData dict
var metaData: Dictionary<String, Any> = [:]
/// Check if image already have its meta data
if let ciImage = image.ciImage {
metaData = ciImage.properties
}
/// Initializing the gpsData dict
var gpsData: Dictionary<String, Any> = [:]
/// Check if there is any gps information
if let gps = metaData[kCGImagePropertyGPSDictionary as String] as? Dictionary<String, Any> {
gpsData = gps
}
/// Adding all the required information to gpsData dictionary
// #1. Data & Time
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy:MM:dd HH:mm:ss"
let localDate = dateFormatter.string(from: location.timestamp)
gpsData[kCGImagePropertyGPSTimeStamp as String] = localDate
// #2. Latitude, Longitude
var latitude = location.coordinate.latitude
var longitude = location.coordinate.longitude
var latRef = ""
var lngRef = ""
if latitude < 0.0 {
latitude *= -1.0
latRef = "S"
} else {
latRef = "N"
}
if longitude < 0.0 {
longitude *= -1.0
lngRef = "W"
}
else {
lngRef = "E"
}
gpsData[kCGImagePropertyGPSLatitudeRef as String] = latRef
gpsData[kCGImagePropertyGPSLongitudeRef as String] = lngRef
gpsData[kCGImagePropertyGPSLatitude as String] = latitude
gpsData[kCGImagePropertyGPSLongitude as String] = longitude
// #3. Accuracy
gpsData[kCGImagePropertyGPSDOP as String] = location.horizontalAccuracy
// #4. Altitude
gpsData[kCGImagePropertyGPSAltitude as String] = location.altitude
/// You can add what more you want to add into gpsData and after that
/// Add this gpsData information into metaData dictionary
metaData[kCGImagePropertyGPSDictionary as String] = gpsData
return metaData
}
func saveImage(_ image:UIImage, withMetadata metaData: Dictionary<String, Any>) {
/// Creating jpgData from UIImage (1 = original quality)
guard let jpgData = UIImageJPEGRepresentation(image, 1) else { return }
/// Adding metaData to jpgData
guard let source = CGImageSourceCreateWithData(jpgData as CFData, nil), let uniformTypeIdentifier = CGImageSourceGetType(source) else {
return
}
let finalData = NSMutableData(data: jpgData)
guard let destination = CGImageDestinationCreateWithData(finalData, uniformTypeIdentifier, 1, nil) else { return }
CGImageDestinationAddImageFromSource(destination, source, 0, metaData as CFDictionary)
guard CGImageDestinationFinalize(destination) else { return }
/// Your destination file path
let filePath = "\(documentsDicrectoryPath)/finalImage.jpg"
/// Now write this image to directory
if FileManager.default.fileExists(atPath: filePath) {
try? FileManager.default.removeItem(atPath: filePath)
}
let success = FileManager.default.createFile(atPath: filePath, contents: finalData as Data, attributes: [FileAttributeKey.protectionKey : FileProtectionType.complete])
if success {
/// Finally Save image to Gallery
/// Important you need PhotoGallery permission before performing below operation.
try? PHPhotoLibrary.shared().performChangesAndWait {
PHAssetChangeRequest.creationRequestForAssetFromImage(atFileURL: URL(fileURLWithPath: filePath))
}
}
}
下面是在PhotoGallery
中查看时黑白正常图像和gps数据图像的差异:
在documentsDirectory
中,如果您看到图像信息,则其外观将如下所示: