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)
当图片数据来自网站时,为什么它会为艺术家的名字提供大括号?
您的数据路径如下所示:
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一步.
| 归档时间: |
|
| 查看次数: |
768 次 |
| 最近记录: |