iOS8开发之 PHAsset 保存图片到相册(相机胶卷) 详解二
2016-01-11 18:36
288 查看
如何通过Photokit保存图片(带有关于定位GPS的Metadata信息)到相册?
http://segmentfault.com/q/1010000004047993我通过以下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有问题?
ios
链接
评论
更多
默认排序时间排序
1 个回答
答案对人有帮助,有参考价值0
答案没帮助,是错误的答案,答非所问
littlecode 2 2015年11月26日
回答
找到答案了,补充上。
首先,保存方法按第二种方法保存。获取的话不需要那么麻烦,直接获取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); } }]; }
链接
评论
更多
相关文章推荐
- iOS8开发之 PHAsset 保存图片到相册(相机胶卷) 详解一
- iOS 9 适配系列教程
- iOS开发-自定义键盘
- iOS使用Xcode7的Instruments检测解决iOS内存泄露
- 文章标题
- iOS页面间传值的方式(Delegate/NSNotification/Block/NSUserDefault/单例)
- iOS 通知传值的使用
- 数据解析
- iOS缓存方案
- iOS 最新版 CocoaPods 的安装流程
- ios-基础用法之【1】-NSLog用法
- iOS~block的使用
- iOS中 动态启动图GIF的简单设置 韩俊强的博客
- iOS中 动态启动图GIF的简单设置 韩俊强的博客
- iOS中加数据锁的方式
- 关于在storyboard中使用静态cell的注意事项
- iOS 多线程实例
- iOS:二维码的扫描
- iOS开发规范
- iOS:二维码的生成