我通过以下2种方法将有关位置的metadata信息写入照片:
将位置信息写入image,让后调用系统api将图片保存到相册
- (void)writeImageDataToSavedPhotosAlbum:(NSData *)imageData metadata:(NSDictionary *)metadata resultBlock:(PHAssetAssetBoolBlock)resultBlock
{
__block PHObjectPlaceholder *placeholderAsset = nil;
[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
UIImage *image = [self imageWithData: imageData metadata:metadata];
[PHAssetChangeRequest creationRequestForAssetFromImage: image];
placeholderAsset = newAssetRequest.placeholderForCreatedAsset;
} completionHandler:^(BOOL success, NSError *error) {
if(success){
PHAsset *asset = [self getAssetFromlocalIdentifier:placeholderAsset.localIdentifier];
completionBlock(asset, YES);
} else {
completionBlock(nil, NO);
}
}];
}
- (UIImage *)imageWithData:(NSData *)imageData metadata:(NSDictionary *)metadata
{
CGImageSourceRef source = CGImageSourceCreateWithData((__bridge CFDataRef)imageData, NULL);
NSMutableDictionary * sourceDic = [NSMutableDictionary dictionary];
NSDictionary *source_metadata = (NSDictionary *)CFBridgingRelease(CGImageSourceCopyProperties(source, NULL));
[sourceDic addEntriesFromDictionary: metadata];
[sourceDic addEntriesFromDictionary:source_metadata];
NSMutableData *dest_data = [NSMutableData data];
CFStringRef UTI = CGImageSourceGetType(source);
CGImageDestinationRef destination = CGImageDestinationCreateWithData((__bridge CFMutableDataRef)dest_data, UTI, 1,NULL);
CGImageDestinationAddImageFromSource(destination, source, 0, (__bridge CFDictionaryRef)sourceDic);
CGImageDestinationFinalize(destination);
CFRelease(source);
CFRelease(destination);
return [UIImage imageWithData: dest_data];
}
2.用PHAssetChangeRequest的location属性保存,代码如下:
+(void)saveImageToCameraRoll:(UIImage*)image location:(CLLocation*)location completionBlock:(PHAssetAssetBoolBlock)completionBlock{
__block PHObjectPlaceholder *placeholderAsset = nil;
[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
PHAssetChangeRequest *newAssetRequest = [PHAssetChangeRequest creationRequestForAssetFromImage:image];
newAssetRequest.location = location;
newAssetRequest.creationDate = [NSDate date];
placeholderAsset = newAssetRequest.placeholderForCreatedAsset;
} completionHandler:^(BOOL success, NSError *error) {
if(success){
PHAsset *asset = [self getAssetFromlocalIdentifier:placeholderAsset.localIdentifier];
completionBlock(asset, YES);
} else {
completionBlock(nil, NO);
}
}];
}
然后获取照片的metadata信息,发现没有关于GPS的信息,获取方法如下:
- (void)getPhotoMetadataWithAsset:(PHAsset *)asset
{
PHImageRequestOptions *request = [PHImageRequestOptions new];
request.version = PHImageRequestOptionsVersionCurrent;
request.deliveryMode = PHImageRequestOptionsDeliveryModeHighQualityFormat;
request.resizeMode = PHImageRequestOptionsResizeModeNone;
request.synchronous = YES;
[[PHImageManager defaultManager] requestImageDataForAsset:asset options: request resultHandler:^(NSData *imageData, NSString *dataUTI, UIImageOrientation orientation, NSDictionary *info) {
CGImageSourceRef source = CGImageSourceCreateWithData((__bridge CFDataRef)imageData, NULL);
if (NULL != source) {
NSDictionary * metadataDic = (NSDictionary *)CFBridgingRelease(CGImageSourceCopyPropertiesAtIndex(source, 0, NULL));
NSLog(@"metada:%@",metadataDic);
CFRelease(source);
}
}];
}
麻烦看下是保存metadata过程有问题?还是获取metadata有问题?
天蓬老师2017-04-17 16:52:55
找到答案了,補充上。
首先,保存方法以第二種方法保存。取得的話不需要那麼麻煩,直接取得asset.location就可以了。
+(void)saveImageToCameraRoll:(UIImage*)image location:(CLLocation*)location completionBlock:(PHAssetAssetBoolBlock)completionBlock{
__block PHObjectPlaceholder *placeholderAsset = nil;
[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
PHAssetChangeRequest *newAssetRequest = [PHAssetChangeRequest creationRequestForAssetFromImage:image];
newAssetRequest.location = location;
newAssetRequest.creationDate = [NSDate date];
placeholderAsset = newAssetRequest.placeholderForCreatedAsset;
} completionHandler:^(BOOL success, NSError *error) {
if(success){
PHAsset *asset = [self getAssetFromlocalIdentifier:placeholderAsset.localIdentifier];
CLLocation * location = asset.location;
completionBlock(asset, YES);
} else {
completionBlock(nil, NO);
}
}];
}
PHPz2017-04-17 16:52:55
補充一下透過 PHObjectPlaceholder 取得 PHAsset 的操作
PHFetchResult *assets = [PHAsset fetchAssetsWithLocalIdentifiers:@[placeholderAsset.localIdentifier] options:nil];
completionBlock(assets.firstObject, nil);