我们用相机或手机拍得的照片或者从网上下载的某些照片其实有一些信息是被我们忽略了的,例如GPS定位信息、拍照所使用的设备信息、镜头、光圈、对比度等等一系列的数据。具体数据你可以在windows下右击图片,选择“属性”进行查看,如下图:
但在IOS编程中如何获取这些信息呢,这些信息又是以什么样的形式存储的,这就是我们今天所要讲的内容。
首先我们先来看一下代码,先看到效果之后我们再一点点进行说明:
具体代码如下:
- (void *)imageInformation:(NSURL *)imageUrl {
CGImageSourceRef imageSource = CGImageSourceCreateWithURL((__bridge CFURLRef)imageUrl, NULL);
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:NO], (NSString *)kCGImageSourceShouldCache,
nil];
CFDictionaryRef imageProperties = CGImageSourceCopyPropertiesAtIndex(imageSource, 0, (__bridge CFDictionaryRef)options);
NSLog(@"%@",imageProperties);
}
输出结果如下图:
一、参数详解
上图我只是截取了一部分,但具体信息你应该一目了然。
其中Altitude(海拔)、Latitude和Longitude(经纬度)、DateTime(日期时间)、Make(设备)、Model(型号系列)这些都是比较常见的。
另外ImgDirection(参考方向),这是拍照时基于正北的一个方向值,值的范围在0~359.9度之间。
二、代码说明
(一)、图片源(CGImageSourceRef)
在上面的代码中我们主要是先建立一个图片源,即CGImageSourceRef,它是图片数据读取的接口,支持UR和Data方式 ,我们可以通过它读取图片缩略图及其属性。
创建图片源有三种方法:
1、CGImageSourceCreateWithURL
基于一个URL链接来读取图片信息。这个方法也是苹果推荐的方法,因为有些时候我们想获取照片的信息,但不需要将照片加载到内存中(因为这是没必要的),所以只需要给出照片的URL地址。
2、CGImageSourceCreateWithData
这个方法是基于一个NSData对象来获取照片信息。所以如果想使用此方法,必需将一个UIImage对象转换成NSData对象,例如:
NSString *filePath = [[NSBundle mainBundle]pathForResource:@"IMG_0" ofType:@"JPG"];
NSData *data = [NSData dataWithContentsOfFile:filePath];
CGImageSourceRef imageSource = CGImageSourceCreateWithData((__bridge CFDataRef)data, nil);
3、CGImageSourceCreateWithDataProvider
这种方法主要是需要将一个CGImageRef生成一个CGDataProvider。而上述中的“option”选项是一个字典,用于创建图片源时提供的附加属性,例如是否对图片进行缓存等。
(二)、获取属性方法
1、将CFDictionaryRef转换成NSDictionary
NSDictionary *dic = (__bridge_transfer NSDictionary*)imageProperties;
2、获取CFDictionaryRef中的键值
CFDictionaryRef tiff = CFDictionaryGetValue(imageProperties, kCGImagePropertyTIFFDict
ionary);
if (tiff) {
NSString *cameraModel = (NSString *)CFDictionaryGetValue(tiff, kCGImagePropertyTIFFMode
l);
NSString *software = (NSString *)CFDictionaryGetValue(tiff, kCGImagePropertyTIFFSoft
ware);
}
CFDictionaryRef gps = CFDictionaryGetValue(imageProperties, kCGImagePropertyGPSDicti
onary);
if (gps) {
NSString *latitude = (NSString *)CFDictionaryGetValue(gps, kCGImagePropertyGPSLatit
ude);
}
参考资料:
http://blog.csdn.net/langya393645864/article/details/18864313