如何在可可中获得图像的作者

Gre*_*Ree 4 cocoa metadata image core-graphics ios

我无法理解为什么metaDic总是为空.有一个代码.

    CFDataRef dataRef = CGDataProviderCopyData(CGImageGetDataProvider(img.CGImage)); //(UIImage *img)
    CGImageSourceRef mySourceRef =  CGImageSourceCreateWithData(dataRef, NULL);
    NSDictionary *metaDic = (NSDictionary *) CGImageSourceCopyPropertiesAtIndex(mySourceRef,0,NULL);
    NSDictionary *tiffDic = (NSDictionary *)[metaDic objectForKey:(NSString *)kCGImagePropertyTIFFDictionary];
    NSString *AuthorName  =  [tiffDic objectForKey:(NSString *)kCGImagePropertyTIFFArtist];
Run Code Online (Sandbox Code Playgroud)

我做了一些获取图片的变种.在这里我发现了:

获取信息的一种方式 - 我需要从网站上获取它,并在那里得到我的信息:

              //  NSURL *UrlPath  - path of picture    image.jpg   from web site
            NSData *dataImg = [NSData dataWithContentsOfURL:UrlPath];

            CGImageSourceRef mySource =  CGImageSourceCreateWithData((CFDataRef)dataImg, NULL); 
            NSDictionary *metaDic = (NSDictionary *) CGImageSourceCopyPropertiesAtIndex(mySource,0,NULL);
            NSDictionary *tiffDic = [metaDic objectForKey:(NSString *)kCGImagePropertyTIFFDictionary];

            /// Log of tiffDic    
tiffDic = {
Artist =(
  "mr. Smith"
  );
}
Run Code Online (Sandbox Code Playgroud)

另一种方式 - 从NSBoudle mainBundle读取图片:

           // NSURL *NSBundleUrl  -  - path of the same  picture    image.jpg   from [[NSBundle mainBundle] 
            CGImageSourceRef mySource = CGImageSourceCreateWithURL( (CFURLRef) NSBundleUrl, NULL);
            NSDictionary *metaDic = (NSDictionary *) CGImageSourceCopyPropertiesAtIndex(mySource,0,NULL);
            NSDictionary *tiffDic = [metaDic objectForKey:(NSString *)kCGImagePropertyTIFFDictionary];

/// Log of tiffDic
tiffDic = {
    Artist = "mr. Smith"; 
}
Run Code Online (Sandbox Code Playgroud)

当图片数据来自网站时,为什么它会为艺术家的名字提供大括号?

fou*_*dry 7

您的数据路径如下所示:

UIImage -> CGImage -> CGDataProvider -> CGImageSource
Run Code Online (Sandbox Code Playgroud)

这是清理元数据图像的第三步.CGDataProviders是一种"较旧"的机制,用于将数据导入Quartz,具有" 有限的功能 " - 这意味着 - 除其他外 - 它们不支持元数据.

尝试这样的事情:

NSData* jpegData = UIImageJPEGRepresentation(image,1.0);
CFDataRef dataRef = (__bridge CFDataRef)jpegData;
CGImageSourceRef source = CGImageSourceCreateWithData(dataRef, NULL);
Run Code Online (Sandbox Code Playgroud)

数据路径:

UIImage -> NS/CFData -> CGImageSource
Run Code Online (Sandbox Code Playgroud)

这将保留元数据.

如果您使用UIImage作为起点,那么以这种方式获取authorName可能没有多少运气.UIImage剥离了原始图像源可能附带的许多元数据(TiffDict似乎被剥离到了orientation标签).您真的希望从它的源读取"未解释的"数据并在不读取图像数据的情况下提取元数据(这是使用a的好处之一CGImageSourceRef).

在github上一个小测试项目,比较从各种来源提取图像元数据的方法 - 文件系统,网络URL,资产库,相机,也许你应该看看.

更新 正如Peter指出的那样(我的项目显示) - 您不应该使用UIImage,而是使用原始数据源.在你的情况下,它是一个文件系统源,如下所示:

 NSString* path = @"/path/to/resource";
 NSData *data = [NSData dataWithContentsOfFile:path];
 CGImageSourceRef source = CGImageSourceCreateWithData((__bridge CFDataRef)data, NULL);
Run Code Online (Sandbox Code Playgroud)

或者更好(正如Peter再次指出的那样!)你可以完全使用CGImageSourceCreateWithURL并跳过这NSData一步.