iOS图片元数据的读写

时间:2022-09-29 16:38:59

图片的本身就是各种图像数据的载体,包含着像素、色彩、灰度等各种数据信息,除此之外,还包含着曝光数据、日期、位置、版权等元数据(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];
  1. 为获取infometadata,要使用ALAssetsLibraryassetForURL: 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图片元数据的读写的更多相关文章

  1. 实现iOS图片等资源文件的热更新化(三):动态的资源文件夹

    简介 此文,将尝试动态从某个不确定的文件夹中加载资源文件.文章,会继续完善自定义的 imageNamed 函数,并为下一篇文章铺垫. 这么做的意义 正如我们经常所说的那样,大多数情景知道做事的意义往往 ...

  2. python 修改、读取图片元数据

    图片元数据 图片元数据(metadata)是嵌入到图片文件中的一些标签.比较像文件属性,但是种类繁多.常见的几种标准有: EXIF:通常被数码相机在拍摄照片时自动添加,比如相机型号.镜头.曝光.图片尺 ...

  3. iOS 图片加载速度优化

    FastImageCache 是 Path 团队开发的一个开源库,用于提升图片的加载和渲染速度,让基于图片的列表滑动起来更顺畅,来看看它是怎么做的. 一.优化点 iOS 从磁盘加载一张图片,使用 UI ...

  4. iOS 图片轮播图(自动滚动)

    iOS 图片轮播图(自动滚动) #import "DDViewController.h" #define DDImageCount 5 @interface DDViewContr ...

  5. jquery mobile上传图片完整例子(包含ios图片横向问题处理和C#后台图片压缩)

    上传图片本身是个基本的小功能,但是到了移动端就不那么简单了,相信找到这篇文章的你一定有深深的同感. 本文实例是:在(移动端)页面中点击图片,然后选择文件,然后保存.使用Asp.net 难点一:后台获取 ...

  6. iOS图片加载到内存中占用内存情况

    我的测试结果: 图片占用内存   图片尺寸           .png文件大小 1MB              512*512          316KB 4MB              10 ...

  7. 实现iOS图片等资源文件的热更新化(五): 一个简单完整的资源热更新页面

    简介 一个简单的关于页面,有一个图片,版本号,App名称等,着重演示各个系列的文章完整集成示例. 动机与意义 这是系列文章的最后一篇.今天抽空写下,收下尾.文章本身会在第四篇的基础上,简单扩充下代码, ...

  8. 实现iOS图片等资源文件的热更新化(零): 序

    必要的序 以后在写系列文章,准备把基本的规划和动机等,单独作为一个小的序言部分给独立出来.序言部分,可以较为完整地交待系列文章的写作动机,所展示的编码技术可能的应用场景等.个人,我还是比较看重文章或者 ...

  9. 大屏iPhone的适配 +iOS 图片尺寸要求

    摘自:http://blog.ibireme.com/2014/09/16/adapted_to_iphone6/ 苹果公司官网设计介绍到:Retina显示屏的超高像素密度已超过人眼能分辨的范围.Re ...

随机推荐

  1. HAOI2015 泛做

    T1 有一棵点数为N的树,树边有边权.给你一个在0~N之内的正整数K,你要在这棵树中选择K个点,将其染成黑色,并将其他的N-K个点染成白色.将所有点染色后,你会获得黑点两两之间的距离加上白点两两之间的 ...

  2. MySQL常见错误及其解决办法

    1.连接类 (1).问题:MySQL server has gone away  解决办法:出现该报错常见的原因是服务器超时了并且关闭了连接.缺省地,如果没有事情发生,服务器在 8个小时后关闭连接.如 ...

  3. TransactionScope使用

    public void FixProjectSorceInsert() { TransactionOptions transactionOption = new TransactionOptions( ...

  4. Android_listview设置每条信息的间距

    Android_listview设置每条信息的间距 设置listView的item间距,可以在xml布局文件中的listView下设置xml属性: android:divider="#000 ...

  5. ReadAndWriteData

    /** * 读取和写入不同基本类型数据 * * @throws IOException */ public static void main(String[] args) throws IOExcep ...

  6. python学习笔记(4)-基本数据类型-数字类型及操作

    大学mooc 北京理工大学 python语言程序设计课程学习笔记 一.整数类型 可正可负,没有取值范围的限制(这个与c不同,c要考虑数据类型的存储空间).如pow(x,y),计算x的y次方,pow(2 ...

  7. TypeScipt学习

    TypeScript具有类型系统,且是JavaScript的超集.它可以编译成普通的JavaScript代码. TypeScript支持任意浏览器,任意环境,任意系统并且是开源的.Ts主要用于解决那些 ...

  8. javascript对样式的操作

    js可实现用户对页面中的选择条件改变页面中的样式,页面样式可以通过style修饰,也可以通过css修饰,先来看一下js改变style样式,代码如下: 案例一: <!DOCTYPE html&gt ...

  9. iOS学习之Object-C语言属性和点语法&lpar;转载收集&rpar;

    一.属性      1.属性的声明:在.h文件中使用@property声明属性.           @property NSString *name;       2.属性的作用是生成setter以 ...

  10. 牛客训练赛25-A-因数个数

    题目链接https://www.nowcoder.com/acm/contest/158/A 无语...这题很迷啊,原谅我的菜,刚开始想用预处理欧拉筛和前缀和,可是这题太血崩了,这样一样要遍历,1-e ...