4

我不明白为什么 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];

我做了一些获取图片的变体。在这里我发现了什么:

使用其信息获取图片的一种方法-我需要从站点获取它,并且那里有我所拥有的:

              //  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"
  );
}

另一种方式 - 从 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"; 
}

当图片数据来自网站时,为什么它将大括号作为艺术家姓名的数组?

4

2 回答 2

7

您的数据路径如下所示:

UIImage -> CGImage -> CGDataProvider -> CGImageSource

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

尝试这样的事情:

NSData* jpegData = UIImageJPEGRepresentation(image,1.0);
CFDataRef dataRef = (__bridge CFDataRef)jpegData;
CGImageSourceRef source = CGImageSourceCreateWithData(dataRef, NULL);

数据路径:

UIImage -> NS/CFData -> CGImageSource

这将保留元数据。

UIImage如果您使用 the作为起点,您可能无法以这种方式获得 authorName 。UIImage剥离了许多可能伴随原始图像源的元数据(TiffDict 似乎被剥离成orientation标签)。您真的想从源中读取“未解释的”数据并在不读取图像数据的情况下提取元数据(这是使用 a 的好处之一CGImageSourceRef)。

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

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

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

或者更好的是(正如彼得再次指出的那样!)您可以完全使用CGImageSourceCreateWithURL并跳过该NSData步骤。

于 2013-04-20T17:31:58.117 回答
1

CGImage 的数据提供者提供原始像素,而不是 PNG 或 TIFF 或其他包含元数据的外部格式数据。因此,没有要获取的属性。

如果该来源甚至无法为您提供图像,我不会感到惊讶,因为它无法知道解释数据的像素格式。

您需要使用获取原始图像的 URL 或数据创建图像源,而不是该图像的像素数据。理想情况下,您应该首先创建图像源,然后从图像源创建图像及其属性。

于 2013-04-19T19:32:14.243 回答