从NSData读取XMP元数据

时间:2016-10-27 13:53:59

标签: ios image

情况: 上传;我需要客户端检查图像是否来自像Theta S或Gear 360这样的相机的360°图像。 通过检查XMP元数据,这应该很容易完成。

但是,ImageIO似乎忽略了XMP元数据,如果运行下面的示例,则DataIO返回的数据中没有XMP条目。

斯威夫特3:

import re

with open('file.txt') as fh:
    blocks = re.findall(r'(?m)^# REG (.*)\n((?:.*\n)*?)# reg ', fh.read())

有什么方法可以从图像NSData中减去XMP-xml?

2 个答案:

答案 0 :(得分:2)

我发现您可以使用CGImageSourceCopyMetadataAtIndex访问此信息。

粗略代码示例:

斯威夫特3:

if let imageSource = CGImageSourceCreateWithData(nsData as CFData, nil),
    let imageProperties = CGImageSourceCopyMetadataAtIndex(imageSource, 0, nil) {
    var result:String = ""
    CGImageMetadataEnumerateTagsUsingBlock(imageProperties, nil, nil, { (key, tag) -> Bool in
        let tagString:NSString = CGImageMetadataTagCopyName(tag) as! NSString
        if tagString == "ProjectionType" {
            result = CGImageMetadataTagCopyValue(tag) as! NSString
            return false
        }
        return true
    })

    print(result) //equirectangular
}

答案 1 :(得分:1)

如果仅检查XMP元数据中的一个特定值,而不是枚举,您也可以像这样搜索它:

guard let source = CGImageSourceCreateWithData(self as NSData, nil) else { return }
guard let metadata = CGImageSourceCopyMetadataAtIndex(source, 0, nil) else { return }
let tag = CGImageMetadataCopyTagWithPath(metadata, nil, "GPano:ProjectionType" as NSString)