访问swift中的EXIF数据



我尝试使用以下示例代码访问Exif数据:

let fileextension = NSURL(fileURLWithPath: mDir + "/" + f).pathExtension
if fileextension == "PSD" || fileextension == "NEF" || fileextension == "3FR" || fileextension == "CR2" || fileextension == "DNG" || fileextension == "JPEG" || fileextension == "JPG" || fileextension == "PSB" || fileextension == "RAF" || fileextension == "TIF" {
let fileattr = try fileManager.attributesOfItem(atPath: mDir + "/" + f)
let filesize = fileattr[FileAttributeKey.size] as! Int64
let UrlPath = URL(fileURLWithPath: mDir + "/" + f)
let imageSource = CGImageSourceCreateWithURL(UrlPath as CFURL, nil)
let result = CGImageSourceCopyMetadataAtIndex(imageSource!, 0, nil)
let d = result as! [AnyHashable:Any]
let tiffDict = d["{TIFF}"] as! [AnyHashable:Any]
let filedate = tiffDict["DateTime"] as! Date

我有一个错误:

无法将类型为'__NSCFType'(0x7fff89750188(的值强制转换为"NSDictionary"(0x7fff89750fe8(。

但是这个示例代码在操场上工作。

有什么解释吗?

要回答实际问题;(,看起来您调用了错误的函数,直接将其作为字典获取,而不是使用CGImageSourceCopyMetadataAtIndex复制元数据,而是使用CGImageSourceCopyPropertiesAtIndex而不是

if let props = CGImageSourceCopyPropertiesAtIndex(imageSource!, 0, nil) as? [String: Any], 
let tiffData = props["{TIFF}"] {
print(tiffData)
}

原始答案

我使用CGImageMetadataCopyTags提取元数据作为数组,然后使用CGImageMetadataTagCopyNameCGImageMetadataTagCopyValue将数据映射到快速字典中

let extensions = ["PSD",  "NEF",  "3FR",  "CR2",  "DNG",  "JPEG",  "JPG",  "PSB",  "RAF",  "TIF"]
let fileManager = FileManager.default
let url = URL(fileURLWithPath: mDir + "/" + f)
var metaData = [String: Any]()
if extensions.contains(url.pathExtension) {
let imageSource = CGImageSourceCreateWithURL(url as CFURL, nil)
if let result = CGImageSourceCopyMetadataAtIndex(imageSource!, 0, nil) {
if let array = CGImageMetadataCopyTags(result) as? [CGImageMetadataTag] {
metaData = array.reduce(into: [String: Any]()) {
guard let name = CGImageMetadataTagCopyName($1),
let value = CGImageMetadataTagCopyValue($1)
else {
return
}
$0[String(name)] = value
}
}
}
}

请注意,这只提供了像"ShutterSpeedValue"这样的标签名称,以包括像"exif"、"tiff"one_answers"xmp"这样的标记类型,我们还可以获得前缀:

guard let prefix = CGImageMetadataTagCopyPrefix($1), 
let name = CGImageMetadataTagCopyName($1),
let value = CGImageMetadataTagCopyValue($1)
else { return }
$0["(prefix):(name)"] = value

最新更新