将 EXIF 元数据写入图像不正确

Incorrect write EXIF metadata to image

我尝试将几个exif参数添加到图像中,但只有少数是可见的。

查看exifDictionary信息时,所有参数都有值 [1]: https://i.stack.imgur.com/4OirK.png

但是在exiftool中查看这个文件,BodySerialNumber是有效的,FileSource是错误的值,DateTimeOriginal是不可见的,真的不明白是怎么回事 [2]: https://i.stack.imgur.com/mf4l4.png

This is my code, where i try to save meta to file

static func encodeImage(at url: URL, file: File, completionHandler: ((URL?) -> Void)?) {
    let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0] as URL
    let filePath = documentsDirectory.appendingPathComponent("\(UUID().uuidString)\(file.fileExtension ?? ".jpg")")

    guard let data = NSData(contentsOf: url),
          let src = CGImageSourceCreateWithData(data, nil),
          let uti = CGImageSourceGetType(src),
          let cfPath = CFURLCreateWithFileSystemPath(nil, filePath.path as CFString, CFURLPathStyle.cfurlposixPathStyle, false),
          let dest = CGImageDestinationCreateWithURL(cfPath, uti, 1, nil)
    else {
        completionHandler?(nil)
        return
    }

    let exifProperties = [
        kCGImagePropertyExifBodySerialNumber as String: file.device ?? "0",
        kCGImagePropertyExifFileSource as String: file.deviceUrl ?? file.path,
        kCGImagePropertyExifDateTimeOriginal as String: "\(file.createdAt.milliseconds)"
    ] as CFDictionary
    
    let exifDictionary = [
        kCGImagePropertyExifDictionary as String: exifProperties
    ] as CFDictionary
    
    CGImageDestinationAddImageFromSource(dest, src, .zero, exifDictionary)
    if CGImageDestinationFinalize(dest) {
        completionHandler?(filePath)
    } else {
        completionHandler?(nil)
    }
}

我该如何解决?

社区维基 主要问题是因为在 Java / Kotlin 中,他们可以在元键中以编程方式写入他们想要的内容,也许他们使用了另一个版本的 exif,我真的不知道,但在 Swift 中你可以使用特殊的格式键。 https://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html

中描述的所有键

当我尝试在 kCGImagePropertyExifFileSource 字段中写入 String 时,我得到 0,因为该字段的结果必须是整数值 1 ... 3

同样的问题kCGImagePropertyExifDateTimeOriginal这里不仅要写一个String,还要写一个特殊格式YYYY: MM: DD HH: MM: SS,其他格式不能写到这个字段!!!

我的意思是,阅读字段格式和类型!)