iOS图片元数据的读写
图片的本身就是各种图像数据的载体,包含着像素、色彩、灰度等各种数据信息,除此之外,还包含着曝光数据、日期、位置、版权等元数据(metadata)。
何为图片元数据
元数据包括许多重要的信息,常用的有Exif(可交换图像文件格式,Exchangeable image file format)、GPS(位置信息)和TIFF(Tagged Image File Format,标签图像文件格式)。
所谓元数据是指Data about Data,就是用来描述数据的数据。
以Exif为例,其中包含了大量信息:
Image Description 图像描述、来源. 指生成图像的工具
Artist 作者 有些相机可以输入使用者的名字
Make 生产者 指产品生产厂家
Model 型号 指设备型号
Orientation方向 有的相机支持,有的不支持
XResolution/YResolution X/Y方向分辨率 本栏目已有专门条目解释此问题。
ResolutionUnit分辨率单位 一般为PPI
Software软件 显示固件Firmware版本
DateTime日期和时间
YCbCrPositioning 色相定位
ExifOffsetExif信息位置,定义Exif在信息在文件中的写入,有些软件不显示。
ExposureTime 曝光时间 即快门速度
FNumber光圈系数
ExposureProgram曝光程序 指程序式自动曝光的设置,各相机不同,可能是Sutter Priority(快门优先)、Aperture Priority(快门优先)等等。
ISO speed ratings感光度
ExifVersionExif版本
DateTimeOriginal创建时间
DateTimeDigitized数字化时间
ComponentsConfiguration图像构造(多指色彩组合方案)
CompressedBitsPerPixel(BPP)压缩时每像素色彩位 指压缩程度
ExposureBiasValue曝光补偿。
MaxApertureValue最大光圈
MeteringMode测光方式, 平均式测光、中央重点测光、点测光等。
Lightsource光源 指白平衡设置
Flash是否使用闪光灯。
FocalLength焦距,一般显示镜头物理焦距,有些软件可以定义一个系数,从而显示相当于35mm相机的焦距 MakerNote(User Comment)作者标记、说明、记录
FlashPixVersionFlashPix版本 (个别机型支持)ColorSpace色域、色彩空间
ExifImageWidth(Pixel X Dimension)图像宽度 指横向像素数
ExifImageLength(Pixel Y Dimension)图像高度 指纵向像素数
Interoperability IFD通用性扩展项定义指针 和TIFF文件相关,具体含义不详
FileSource源文件 Compression压缩比。
这些数据就是构成一张图片的元素,也相当于一张图片的名片,包含着丰富的信息。
你可以在此了解更多关于Exif的具体研究。
在开发中使用
目前市场上的大部分智能手机拍摄的照片都支持写入元数据,因此我们可以利用图片的元数据来携带需要添加的数据。在处理图片时,我们往往需要对图片数据进行操作,除了操作其中的图像信息外,我们还可以对图片信息的元数据进行操作,包括存和取。这对于传递数据将是十分便利的,其中一方只需将数据写入图片,另一方通过读取图片的元数据就可获取所要传递的数据,而不需要传除图片之外的任何对象,在实际开发中应用场景很多。
My Codes
Metadata read
首先,我们需要借助与
UIImagePickerControllerDelegate的代理方法,创建一个UIImagePickerController,在其代理方法- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info中就可获取info,从而获取image对象:
UIImage *image = [info valueForKey:UIImagePickerControllerOriginalImage];
为获取
info的metadata,要使用ALAssetsLibrary的assetForURL: resultBlock:方法:
//1. 首先得到Reference URL
NSURL *assetURL = [info objectForKey:UIImagePickerControllerReferenceURL];
//2. 创建一个ALAssetsLibrary
ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
//3. 使用回调方法,得到字典类型的metadata
[library assetForURL:assetURL
resultBlock:^(ALAsset *asset) { NSDictionary *imageMetadata = [[NSMutableDictionary alloc] initWithDictionary:asset.defaultRepresentation.metadata]; NSLog(@"metadata:--%@",imageMetadata); NSDictionary *gpsDic = [imageMetadata objectForKey:@"{GPS}"];
NSDictionary *exifDic = [imageMetadata objectForKey:@"{Exif}"];
NSDictionary *tiffDic = [imageMetadata objectForKey:@"{TIFF}"]; //可交换图像文件
NSLog(@"Exif info:--%@",exifDic);
//地理位置信息
NSLog(@"GPS info:--%@",gpsDic);
//图像文件格式
NSLog(@"tiff info:--%@",tiffDic);
}
Metadata Write
以向图片元数据中写入Exif的kCGImagePropertyExifDateTimeOriginal为例。
1.先按照特定的格式创建一个日期对象:
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"YYYY:MM:dd hh:mm:ss"];
NSString *now = [formatter stringFromDate:[NSDate date]];
2.将之前的exifDic中的对应字段值设为当前日期对象now:
[exifDic setValue:now forKey:(NSString*)kCGImagePropertyExifDateTimeOriginal];
[imageMetadata setValue:exifDic forKey:@"{Exif}"];
3.利用ALAssetsLibrary的writeImageToSavedPhotosAlbum: metadata: completionBlock方法写入并保存:
[library writeImageToSavedPhotosAlbum:[image CGImage] metadata:imageMetadata completionBlock:^(NSURL *assetURL, NSError *error) {
if (error == nil)
NSLog(@"metadata write success!");
else
NSLog(@"write error:%@",error.userInfo);
}];
这样,图片的创建时间就被写入并保存了,如果是对相册中已经存在的图片进行此写入操作,则其将被更改创建时间而另存。
扩展
如果你想写入中文或者自定义数据,可以考虑将数据写入到kCGImagePropertyExifUserComment中。
UserComment标签说明
标签号:0x9286;格式:undefined;描述:存储用户的注释,这个标签允许使用两字节的德字符或者 unicode,前8 个字节描述的是字符集,'JIS' 是日文 (著名的有 Kanji)。
'0x41,0x53,0x43,0x49,0x49,0x00,0x00,0x00':ASCII
'0x4a,0x49,0x53,0x00,0x00,0x00,0x00,0x00':JIS
'0x55,0x4e,0x49,0x43,0x4f,0x44,0x45,0x00':Unicode
'0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00':Undefined
UserComment写入的代码实现
NSString *userComment = @"你好,this is a test text for writing data in UserComment";
[exifDic setValue:userComment forKey:(NSString*)kCGImagePropertyExifUserComment];
[imageMetadata setValue:exifDic forKey:@"{Exif}"];
为了方便理解和扩展,笔者在Github上提交了一个Deme:ImageMetadata。
iOS图片元数据的读写的更多相关文章
- 实现iOS图片等资源文件的热更新化(三):动态的资源文件夹
简介 此文,将尝试动态从某个不确定的文件夹中加载资源文件.文章,会继续完善自定义的 imageNamed 函数,并为下一篇文章铺垫. 这么做的意义 正如我们经常所说的那样,大多数情景知道做事的意义往往 ...
- python 修改、读取图片元数据
图片元数据 图片元数据(metadata)是嵌入到图片文件中的一些标签.比较像文件属性,但是种类繁多.常见的几种标准有: EXIF:通常被数码相机在拍摄照片时自动添加,比如相机型号.镜头.曝光.图片尺 ...
- iOS 图片加载速度优化
FastImageCache 是 Path 团队开发的一个开源库,用于提升图片的加载和渲染速度,让基于图片的列表滑动起来更顺畅,来看看它是怎么做的. 一.优化点 iOS 从磁盘加载一张图片,使用 UI ...
- iOS 图片轮播图(自动滚动)
iOS 图片轮播图(自动滚动) #import "DDViewController.h" #define DDImageCount 5 @interface DDViewContr ...
- jquery mobile上传图片完整例子(包含ios图片横向问题处理和C#后台图片压缩)
上传图片本身是个基本的小功能,但是到了移动端就不那么简单了,相信找到这篇文章的你一定有深深的同感. 本文实例是:在(移动端)页面中点击图片,然后选择文件,然后保存.使用Asp.net 难点一:后台获取 ...
- iOS图片加载到内存中占用内存情况
我的测试结果: 图片占用内存 图片尺寸 .png文件大小 1MB 512*512 316KB 4MB 10 ...
- 实现iOS图片等资源文件的热更新化(五): 一个简单完整的资源热更新页面
简介 一个简单的关于页面,有一个图片,版本号,App名称等,着重演示各个系列的文章完整集成示例. 动机与意义 这是系列文章的最后一篇.今天抽空写下,收下尾.文章本身会在第四篇的基础上,简单扩充下代码, ...
- 实现iOS图片等资源文件的热更新化(零): 序
必要的序 以后在写系列文章,准备把基本的规划和动机等,单独作为一个小的序言部分给独立出来.序言部分,可以较为完整地交待系列文章的写作动机,所展示的编码技术可能的应用场景等.个人,我还是比较看重文章或者 ...
- 大屏iPhone的适配 +iOS 图片尺寸要求
摘自:http://blog.ibireme.com/2014/09/16/adapted_to_iphone6/ 苹果公司官网设计介绍到:Retina显示屏的超高像素密度已超过人眼能分辨的范围.Re ...
随机推荐
- 为自己打造Linux小系统
一.前言 Linux操作系统至1991.10.5号诞生以来,就源其开源性和自由性得到了很多技术大牛的青睐,每个Linux爱好者都为其贡献了自己的一份力,不管是在Linux内核还是开源软件等方面,都为 ...
- I.MX6 bq27441 driver hacking
/************************************************************************* * I.MX6 bq27441 driver ha ...
- 【转】10分钟搭建NDK的Android开发环境
原文网址:http://blog.csdn.net/u012176591/article/details/23018913 作者:金良(golden1314521@gmail.com) csdn博客: ...
- WCF发布后远程访问的域名解析问题
环境: VS2010 sp1,.net framework 4.0,windows server 2003 x64 ,iis 6.0 症状: WCF开发测试,本地调用都正常.发布后,在浏览器中访问ht ...
- 在PowerDesigner中设计物理模型2——约束
唯一约束 唯一约束与创建唯一索引基本上是一回事,因为在创建唯一约束的时候,系统会创建对应的一个唯一索引,通过唯一索引来实现约束.不过唯一约束更直观的表达了对应列的唯一性,使得对应索引的目的更加清晰,所 ...
- java jvm学习笔记十(策略和保护域)
欢迎转载请说明出处:http://blog.csdn.net/yfqnihao/article/details/8271415 前面一节,我们做了一个简单的实验,来说明什么是策略文件,在文章的最后,也 ...
- WebDriver 运行模式下使用rc 代码
selenium2 对之前的rc 代码提供了兼容性接口,如果你之前的code 都是用rc 写,而现在又想摆脱要每次启动server,你只需要 略做修改即可.代码如下: public class Tes ...
- Mongo DB 安装-及分布式集群部署(初稿)
一.安装步骤, 1, 下载最新的Mongo DB数据库:http://www.mongodb.org/downloads?_ga=1.44426535.2020731121.1421844747\ 下 ...
- Linux批量修改指定目录下的文件或文件夹权限
在Puppet下很头大,尤其是文件拷贝,使用file的mode会导致文件或文件夹都一个权限. 暂时使用命令代替: 最近忙着明年的N多计划,待有空后继续研究.
- STM32L152 Keil 开发环境 显示Internal command error Flash down
使用Keil开发环境对STM32L Discovery进行开发,更新一次firmware后就不能连接目标板了,报错Internal command error Flash download faile ...