【问题标题】:Incorrect write EXIF metadata to image错误地将 EXIF 元数据写入图像
【发布时间】:2021-12-27 11:57:58
【问题描述】:

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

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

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

这是我的代码,我尝试将元数据保存到文件中

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)
    }
}

我该如何解决?

【问题讨论】:

  • FileSource 不是文件名,而是输入设备的类型
  • @JoakimDanielson Thx,也许你知道我必须使用什么键来写入文件的原始路径?
  • 尝试在文件上运行这个 exiftool 命令:exiftool -v2 file.png 这将为您提供数据在文件中的位置的细分。您要检查的内容是查看 EXIF 数据是否存储在 PNG eXIf 块或 PNG zTXt 块中。如果它在 zTXt 块中,那么您正在编写非标准 EXIF。在 2017 年年中之前,PNG 没有官方的 EXIF 标准,但一些程序将 EXIF 数据写入zTXt 作为一种变通方法。
  • exiftool Filepath 不是嵌入式标签。它是从底层文件系统中获取的文件的绝对路径。如果您检查exiftool Extra tags page,您会看到它被列为“系统”标签。

标签: ios swift image metadata exif


【解决方案1】:

社区维基 主要问题是因为在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,其他格式不能写到这个字段!!!

我的意思是,了解字段格式和类型!)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-11
    • 2013-11-10
    • 2015-02-28
    • 2019-10-06
    • 1970-01-01
    • 2015-12-14
    • 2013-07-11
    • 1970-01-01
    相关资源
    最近更新 更多