【问题标题】:access EXIF data in swift快速访问 EXIF 数据
【发布时间】:2020-07-22 22:29:17
【问题描述】:

我尝试使用此示例代码访问 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 返回CGImageMetadata,它不能转换为字典。
  • 然后呢?为什么它在操场上工作?
  • 我在 Playground 中运行代码时出现同样的错误

标签: swift exif


【解决方案1】:

要回答实际问题 ;),您似乎调用了错误的函数来直接将其作为字典获取,而不是使用 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”、“xmp”等标签的类型,我们还可以获取前缀:

guard let prefix = CGImageMetadataTagCopyPrefix($1), 
      let name = CGImageMetadataTagCopyName($1),
      let value = CGImageMetadataTagCopyValue($1)
else { return }

$0["\(prefix):\(name)"] = value

【讨论】:

    猜你喜欢
    • 2015-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多