Как добавить свойства для изображения UIImagePicker Swift 4 - PullRequest
0 голосов
/ 06 сентября 2018

Я хочу сделать снимок и добавить свойства долготы и широты, я пробовал несколько раз каждый пример, доступный в StackOverflow, но он не работает. Я использую UIImagePickerController для захвата изображения и UIImageWriteToSavedPhotosAlbum для сохранения данных в альбом

Свойство должно выглядеть следующим образом

enter image description here

Но теперь мое изображение выглядит так

enter image description here

1 Ответ

0 голосов
/ 07 сентября 2018

Я не знаю, что вы уже пробовали и каковы ваши требования, но в соответствии с вашим вопросом, вот пример установки 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))
        }
    }
}

Ниже приведена разница ч / б обычного изображения и данных GPS при просмотре в PhotoGallery:

Before After

А в documentsDirectory, если вы видите информацию об изображении, она будет выглядеть так:

Image Get Info in documents directory

...