如何为图像 UIImagePicker 添加属性 Swift 4
How to Add Properties For Image UIImagePicker Swift 4
我想捕捉图像并添加经度和纬度属性,我尝试了好几次 Whosebug 上可用的每个示例,但都不起作用。我使用 UIImagePickerController
来捕捉图像并使用 UIImageWriteToSavedPhotosAlbum
将数据保存到相册
属性 必须看起来像这样
但现在我的图像如下所示
我不知道您到目前为止尝试了什么以及您的要求是什么,但根据您的问题,这里是将 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))
}
}
}
以下是 b/w 正常和 gps 数据图像在 PhotoGallery
中查看时的差异:
并且在 documentsDirectory
中,如果您看到图像信息,它将如下所示:
我想捕捉图像并添加经度和纬度属性,我尝试了好几次 Whosebug 上可用的每个示例,但都不起作用。我使用 UIImagePickerController
来捕捉图像并使用 UIImageWriteToSavedPhotosAlbum
将数据保存到相册
属性 必须看起来像这样
但现在我的图像如下所示
我不知道您到目前为止尝试了什么以及您的要求是什么,但根据您的问题,这里是将 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))
}
}
}
以下是 b/w 正常和 gps 数据图像在 PhotoGallery
中查看时的差异:
并且在 documentsDirectory
中,如果您看到图像信息,它将如下所示: