【问题标题】:How to Add Properties For Image UIImagePicker Swift 4如何为图像 UIImagePicker Swift 4 添加属性
【发布时间】:2019-02-11 06:59:54
【问题描述】:

我想捕获图像并添加属性经度和纬度,我尝试了 StackOverflow 上的每个示例,但都不起作用。我使用UIImagePickerController 捕获图像并使用UIImageWriteToSavedPhotosAlbum 将数据保存到相册

属性必须如下所示

但现在我的图像如下所示

【问题讨论】:

    标签: ios swift gps uiimagepickercontroller exif


    【解决方案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 中看到图像信息,它会是这样的:

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-20
    • 1970-01-01
    • 2014-02-14
    • 2011-12-22
    • 1970-01-01
    • 1970-01-01
    • 2012-10-28
    • 2022-11-11
    相关资源
    最近更新 更多