如何为图像 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 中,如果您看到图像信息,它将如下所示: