записывать метаданные GPS в EXIF ​​в Swift - PullRequest
0 голосов
/ 13 февраля 2019

Я пытаюсь записать GPS-координаты на изображение, снятое в моем приложении.Поэтому я искал код для использования и написал функцию, которая принимает Data, а также возвращает Data (поскольку мне нужно отправить его следующим образом Firebase.

Но как бы я нипохоже, что этот код написан, метаданные не будут «прилипать» к картинке. При загрузке картинка выглядит правильно, но при загрузке она не содержит больше метаданных, чем размер фотографии.

ЕстьЯ что-то здесь упустил?

func setMetaData(imageData: Data) -> Data? {

    var source: CGImageSource? = nil
    source = CGImageSourceCreateWithData((imageData as CFData?)!, nil)
    let metadata = CGImageSourceCopyPropertiesAtIndex(source!, 0, nil) as? [AnyHashable: Any]
    var metadataAsMutable = metadata
    var EXIFDictionary = (metadataAsMutable?[(kCGImagePropertyExifDictionary as String)]) as? [AnyHashable: Any]
    var GPSDictionary = (metadataAsMutable?[(kCGImagePropertyGPSDictionary as String)]) as? [AnyHashable: Any]

    if !(EXIFDictionary != nil) {
        EXIFDictionary = [AnyHashable: Any]()
    }
    if !(GPSDictionary != nil) {
        GPSDictionary = [AnyHashable: Any]()
    }

    GPSDictionary![(kCGImagePropertyGPSLatitude as String)] = 30.21313
    GPSDictionary![(kCGImagePropertyGPSLongitude as String)] = 76.22346

    let dest_data = NSMutableData()
    guard let imageDest = CGImageDestinationCreateWithData(dest_data as CFMutableData, kUTTypeJPEG, 1, nil) else { return nil }
    CGImageDestinationAddImageFromSource(imageDest, source!, 0, (metadataAsMutable as CFDictionary?))


    if CGImageDestinationFinalize(imageDest) {

        return dest_data as Data
    } else {
        print("FAILED")
    }
    return nil
}

1 Ответ

0 голосов
/ 14 февраля 2019

Я нашел решение, которое не очень красиво, но оно полностью справляется с работой

func addMetaData(data: Data) -> NSData? {

    guard let source = CGImageSourceCreateWithData(data as CFData, nil) else {return nil}
    guard let type = CGImageSourceGetType(source) else {return nil}
    let mutableData = NSMutableData(data: data)
    guard let destination = CGImageDestinationCreateWithData(mutableData, type, 1, nil) else {
        return nil}

    guard let path = Bundle.main.url(forResource: "predict_pic", withExtension: "jpg") else {
        return nil }
    let imageSource = CGImageSourceCreateWithURL(path as CFURL, nil)
    let imageProperties = CGImageSourceCopyMetadataAtIndex(imageSource!, 0, nil)

    let mutableMetadata = CGImageMetadataCreateMutableCopy(imageProperties!)

    CGImageMetadataSetValueMatchingImageProperty(mutableMetadata!, kCGImagePropertyGPSDictionary, kCGImagePropertyGPSLatitudeRef, "N" as CFTypeRef)
    CGImageMetadataSetValueMatchingImageProperty(mutableMetadata!, kCGImagePropertyGPSDictionary, kCGImagePropertyGPSLatitude, location.coordinate.latitude as CFTypeRef)
    CGImageMetadataSetValueMatchingImageProperty(mutableMetadata!, kCGImagePropertyGPSDictionary, kCGImagePropertyGPSLongitudeRef, "E" as CFTypeRef)
    CGImageMetadataSetValueMatchingImageProperty(mutableMetadata!, kCGImagePropertyGPSDictionary, kCGImagePropertyGPSLongitude, location.coordinate.longitude as CFTypeRef)

    let finalMetadata:CGImageMetadata = mutableMetadata!
    CGImageDestinationAddImageAndMetadata(destination, UIImage(data: data)!.cgImage! , finalMetadata, nil)
    guard CGImageDestinationFinalize(destination) else { return nil }
    return mutableData;
}
...