本人已参加「新人创造礼」活动,一起敞开创造之路。

图片的本身便是各种图画数据的载体,包含着像素、颜色、灰度等各种数据信息,除此之外,还包含着曝光数据、日期、方位、版权等元数据(metadata)。

iOS图片元数据的读写

何为图片元数据

元数据包含许多重要的信息,常用的有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
  1. 首要,咱们需求凭借与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。

有问题请评论或提交issue。