【发布时间】: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