Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 将CGImageMetadata转换为nsdictionary_Ios_Metadata_Nsdictionary - Fatal编程技术网

Ios 将CGImageMetadata转换为nsdictionary

Ios 将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);

我尝试将我的360°元数据图像转换为nsdictionary。每次我试图打印属性值时应用程序崩溃。我写了这段代码

CGImageSourceRef source=CGImageSourceCreateWithData((uu桥CFDataRef)imageData,NULL); NSArray*metadataArray=nil

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)