Некоторые метаданные EXIF не будут обновляться в Swift

#swift #exif

Вопрос:

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

     func writeMetadata(originalImage url: URL) {

        let newDestinationPath = NSTemporaryDirectory().appending("Out.jpg")
        let newDestinationURL = URL(fileURLWithPath: newDestinationPath)

        // Create source and destination
        guard let imageData = try? Data(contentsOf: url),
              let imageSource = CGImageSourceCreateWithData(imageData as CFData, nil),
              let utf = CGImageSourceGetType(imageSource),
              let destination = CGImageDestinationCreateWithURL(newDestinationURL as CFURL, utf, 1, nil) else { return }

        // Get original metadata
        guard let originalImageProperties = CGImageSourceCopyPropertiesAtIndex(imageSource, 0, nil) as? NSDictionary,
              let mutableDictionary = originalImageProperties.mutableCopy() as? NSMutableDictionary,
              let exifDictionary = mutableDictionary[kCGImagePropertyExifDictionary as String] as? NSMutableDictionary else { return }
        print("Original metadata: (originalImageProperties)")

        // These properties successfully update
        exifDictionary["CameraOwnerName"] = "ADB"
        exifDictionary["ApertureValue"] = 1

        // This property doesn't update
        print("Date Before: (exifDictionary[kCGImagePropertyExifDateTimeDigitized as String])")
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "yyyy:MM:dd HH:mm:ss"
        exifDictionary[kCGImagePropertyExifDateTimeDigitized as String] = dateFormatter.string(from: Date())
        print("Date After: (exifDictionary[kCGImagePropertyExifDateTimeDigitized as String])")

        // Update original metadata with updated Exif dictionary
        mutableDictionary[kCGImagePropertyExifDictionary as String] = exifDictionary

        // Write new file
        CGImageDestinationAddImageFromSource(destination, imageSource, 0, mutableDictionary as CFDictionary)
        CGImageDestinationFinalize(destination)

        // Fetch updated metadata
        guard let newSource = CGImageSourceCreateWithURL(newDestinationURL as CFURL, nil),
              let newMetadata = CGImageSourceCopyPropertiesAtIndex(newSource, 0, nil) else { return }
        print("Newly updated metadata: (newMetadata)")
    }
 

Любое руководство очень ценится!

Ответ №1:

Я запустил ваш код, который работает нормально, и EXIF данные обновлены, как и ожидалось DateTimeDigitized . Возможно ли, чтобы вы вместо этого проверили DateTimeOriginal метаданные или {TIFF} метаданные, которые вы не обновляете?

Если вы хотите задать DateTimeOriginal метаданные, это можно сделать, как показано ниже, с помощью ключа kCGImagePropertyExifDateTimeOriginal

 exifDictionary[kCGImagePropertyExifDateTimeOriginal as String] = dateFormatter.string(from: Date())
 

Комментарии:

1. Спасибо, что проверили. Странно, но файл, который я изначально использовал, не обновляется, но я попробовал несколько других файлов, и они это сделали — так что, должно быть, что-то странное с исходным файлом.