#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. Спасибо, что проверили. Странно, но файл, который я изначально использовал, не обновляется, но я попробовал несколько других файлов, и они это сделали — так что, должно быть, что-то странное с исходным файлом.