圖片的本身就是各種圖像數據的載體,包含著像素、色彩、灰度等各種數據信息,除此之外,還包含著曝光數據、日期、位置、版權等元數據(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的具體研究。
目前市場上的大部分智能手機拍攝的照片都支持寫入元數據,因此我們可以利用圖片的元數據來攜帶需要添加的數據。在處理圖片時,我們往往需要對圖片數據進行操作,除了操作其中的圖像信息外,我們還可以對圖片信息的元數據進行操作,包括存和取。這對於傳遞數據將是十分便利的,其中一方只需將數據寫入圖片,另一方通過讀取圖片的元數據就可獲取所要傳遞的數據,而不需要傳除圖片之外的任何對象,在實際開發中應用場景很多。
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。