Ios 将CGImageMetadata转换为nsdictionary
我尝试将我的360°元数据图像转换为nsdictionary。每次我试图打印属性值时应用程序崩溃。我写了这段代码 CGImageSourceRef source=CGImageSourceCreateWithData((uu桥CFDataRef)imageData,NULL); NSArray*metadataArray=nilIos 将CGImageMetadata转换为nsdictionary,ios,metadata,nsdictionary,Ios,Metadata,Nsdictionary,我尝试将我的360°元数据图像转换为nsdictionary。每次我试图打印属性值时应用程序崩溃。我写了这段代码 CGImageSourceRef source=CGImageSourceCreateWithData((uu桥CFDataRef)imageData,NULL); NSArray*metadataArray=nil if (source) { _metaData = CGImageSourceCopyMetadataAtIndex(source, 0, NULL);
if (source) {
_metaData = CGImageSourceCopyMetadataAtIndex(source, 0, NULL);
if (_metaData) {
metadataArray = CFBridgingRelease(CGImageMetadataCopyTags(_metaData));
CFRelease(_metaData);
}
CFRelease(source);
}
NSLog(@"%@",metadataArray[12]);//this is the problem
在输出中,我发现immutableMetadata的类型是CGImageMetadata,而不是NSdictionary。我怎样才能转换成nsdictionary呢???我对
ImageIO
不太了解。它充满了CF
/CG
的东西,这可能会导致\uu桥
的使用。您只对某个值感兴趣,但如果有人正在寻找另一个值,则可以使用该示例代码/研究:
我研究了
CGImageMetadata.h
中与CGImageMetadataTagRef
相关的函数的每次使用,这些函数可能很有用
CGImageSourceRef source = CGImageSourceCreateWithData((CFDataRef)imagedata, NULL);
CGImageMetadataRef imageMetadataRef = CGImageSourceCopyMetadataAtIndex(source, 0, NULL);
NSArray *metadata = CFBridgingRelease(CGImageMetadataCopyTags(imageMetadataRef));
NSLog(@"metadata = %@", metadata);
for (id aRef in metadata)
{
CGImageMetadataTagRef currentRef = (__bridge CGImageMetadataTagRef)(aRef);
NSLog(@"Ref: %@", currentRef);
CGImageMetadataType type = CGImageMetadataTagGetType(currentRef);
NSLog(@"Type: %d", type);
CFStringRef nameSpace = CGImageMetadataTagCopyNamespace(currentRef);
NSLog(@"NameSpace: %@", nameSpace);
CFStringRef prefix = CGImageMetadataTagCopyPrefix(currentRef);
NSLog(@"prefix: %@", prefix);
CFStringRef name = CGImageMetadataTagCopyName(currentRef);
NSLog(@"name: %@", name);
CFTypeRef value = CGImageMetadataTagCopyValue(currentRef);
NSLog(@"Value: %@", value);
CFStringRef valueTypeStr = CFCopyTypeIDDescription(CFGetTypeID(value));
NSLog(@"valueTypeStr: %@", valueTypeStr);
//Test related to question
if ([@"GPano" isEqualToString:(__bridge NSString *)prefix] && [@"PoseHeadingDegrees" isEqualToString:(__bridge NSString *)name])
{
NSString *str = (__bridge NSString *)value;
NSLog(@"Str: %@", str);
NSLog(@"Int: %d", [str intValue]);
}
}
为了知道值是否可转换为更“已知”的对象,如NSString
(CFString
)、NSArray
(CFArray
)、NSDictionary
(CFDictionary
),我查看了CFStringRef valueTypeStr=CFCopyTypeIDDescription(CFGetTypeID(value))代码>(或者您也可以对相关问题进行“快速测试”:
这一切都是“手动”完成的,我很惊讶没有从cImageMetadataTagRef
转换为更“已知”的对象(而不是struct
),可能有,我没有阅读cImageMetadata.h
的全部标题,所以可能有一种更快的方法,但我认为即使使用“老派”方法,通过挖掘,可以帮助其他有相关问题的用户快速找到他/她想要的东西
回答您最初的问题:CGImageMetadata
到NSDictionary
,如果没有“轻松转换”工具,并且使用“挖掘”方法,它就没有多大意义,因为有趣的方法CGImageMetadataCopyTags
返回一个NSArray
(或CFArray
)。
但是由于许多CGImageMetadataTagRef
前缀是相同的,您可能会感兴趣,可以手动执行以下词典:
@{prefix1:@[stuff10、stuff11等]、prefix2:@[stuff20、stuff21等]}
Swift
extension CGImageSource {
func metadata() -> Dictionary<String, Any>? {
guard let imageMetadata = CGImageSourceCopyMetadataAtIndex(self, 0, .none) else {
return .none
}
guard let tags = CGImageMetadataCopyTags(imageMetadata) else {
return .none
}
var result = [String: Any]()
for tag in tags as NSArray {
let tagMetadata = tag as! CGImageMetadataTag
if let cfName = CGImageMetadataTagCopyName(tagMetadata) {
let name = String(cfName)
let value = CGImageMetadataTagCopyValue(tagMetadata)
result[name] = value
}
}
return result
}
}
扩展CGImageSource{
func metadata()->字典{
guard let imageMetadata=CGImageSourceCopyMetadataAtIndex(self,0,.none)其他{
返回,无
}
guard let tags=CGImageMetadataCopyTags(imageMetadata)else{
返回,无
}
var result=[String:Any]()
用于标记中的标记作为NSArray{
让tagMetadata=标记为!CGImageMetadataTag
如果让cfName=CGImageMetadataTagCopyName(tagMetadata){
let name=String(cfName)
let value=CGImageMetadataTagCopyValue(tagMetadata)
结果[名称]=值
}
}
返回结果
}
}
不清楚。我在前面的问题上说过,cImageSourceCopyMetadataAtIndex
返回一个cImageMetadataRef
,它可以通过cImageMetadataCopyTags
转换为NSArray
。给出一个你想要的例子,因为把数组转换成字典,它有意义吗?您不能将这样的东西转换为期望桥接将完成所有工作。谢谢,我现在明白了,我对返回的CGImageMetadataRef类型(即Nsarray)感到困惑。如果您想要一个字典,您可以这样做,但您可能必须手动这样做。我记录了NSArray
,它们有很多相似的类型,可以重新组合:“exif”、“tiff”、“xmp”等。但是我不知道如何转换它们,请检索类型,如kcgimanagedataprefixexif
。我更改了代码如下:CGImageSourceRef source=CGImageSourceCreateWithData(u桥CFDataRef)图像数据,空);NSArray*metadataArray=nil;if(source){u metaData=cgmagesourcecopymataatindex(source,0,NULL);if({u metaData){metadataArray=cfbrigingrease(cgmagemetadatacopytags(_metaData));CFRelease(_metaData);}CFRelease(source);}NSLog(@“%@”,metadataArray[12]);它显示了所有的标记行,比如:GPano:PoseHeadingDegrees=260。我只想得到260个值???只是想添加它以确保标记是字典中的唯一键。您可能需要let cfPrefix=cgimaMetadataTagCopyPrefix(tagMetadata)
然后let name=String(cfPrefix)+:“+String(cfName)