将 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
,其他格式不能写到这个字段!!!
我的意思是,阅读字段格式和类型!)
我尝试将几个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
,其他格式不能写到这个字段!!!
我的意思是,阅读字段格式和类型!)