IOS 修改图片的地理位置信息
直接上代码:
// // ViewController.m // changeLocation // // Created by 陈飞 on 16/10/31. // Copyright © 2016年 liusong. All rights reserved. // #import "ViewController.h" #import "UploadImageView.h" #import "UIToast.h" @interface ViewController () @property (weak, nonatomic) IBOutlet UITextField *longitude; @property (weak, nonatomic) IBOutlet UITextField *latitude; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } - (IBAction)change:(id)sender { if (self.longitude.text.length<=0||self.latitude.text.length<=0) { [UIToast showMessage:@"请输入经纬度"]; return; } //浮点数值使用CGFloat,NSDecimalNumber对象进行处理: NSDecimalNumber *longitude = [[NSDecimalNumber alloc] initWithString:self.longitude.text]; NSDecimalNumber *latitude = [[NSDecimalNumber alloc] initWithString:self.latitude.text]; [UploadImageView showUpUploadImageViewWithBlockImage:^(UIImage *newImage) { } longitude:[longitude doubleValue ] latitude:[latitude doubleValue ]]; } @end
图像处理类M:
// // UploadImageView.m // kuaichengwuliu // // Created by 陈飞 on 16/4/30. // Copyright © 2016年 kuaicheng. All rights reserved. // #import "UploadImageView.h" #import <AssetsLibrary/AssetsLibrary.h> #import <ImageIO/ImageIO.h> #import "UIToast.h" @interface UploadImageView () < UITableViewDelegate, UITableViewDataSource, UINavigationControllerDelegate, UIImagePickerControllerDelegate, UIGestureRecognizerDelegate, UIActionSheetDelegate> @property(nonatomic, weak) UITableView *tableView; @property(nonatomic, strong) NSArray *contents; @property(nonatomic, assign) int index; @property(nonatomic,strong)NSMutableDictionary* mediaInfo;//当前照片的mediaInfo @property(nonatomic,strong) UIImage *image; @property (nonatomic,assign) CGFloat longitude; @property (nonatomic,assign) CGFloat latitude; @end @implementation UploadImageView + (void)showUpUploadImageViewWithBlockImage:(BlockImage)blockImage longitude:(CGFloat)longitude latitude:(CGFloat)latitude { UploadImageView *v = [[UploadImageView alloc] init]; v.longitude=longitude; v.latitude=latitude; [[UIApplication sharedApplication].keyWindow addSubview:v]; v.clickBlockImage = blockImage; if ([[UIDevice currentDevice].systemVersion doubleValue] >= 8.0) { UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"请选择" message:nil preferredStyle:(UIAlertControllerStyleActionSheet)]; UIAlertAction *action1 = [UIAlertAction actionWithTitle:@"相册" style:(UIAlertActionStyleDefault) handler:^(UIAlertAction *_Nonnull action) { UIImagePickerController *picker = [[UIImagePickerController alloc] init]; picker.delegate = v; picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; [[UIApplication sharedApplication] .keyWindow.rootViewController presentViewController:picker animated:YES completion:nil]; }]; UIAlertAction *action2 = [UIAlertAction actionWithTitle:@"拍照" style:(UIAlertActionStyleDefault) handler:^(UIAlertAction *_Nonnull action) { UIImagePickerController *picker = [[UIImagePickerController alloc] init]; picker.delegate = v; picker.sourceType = UIImagePickerControllerSourceTypeCamera; [[UIApplication sharedApplication] .keyWindow.rootViewController presentViewController:picker animated:YES completion:nil]; }]; UIAlertAction *action3 = [UIAlertAction actionWithTitle:@"取消" style:(UIAlertActionStyleCancel) handler:^(UIAlertAction *_Nonnull action) { [v removeFromSuperview]; }]; [alert addAction:action1]; [alert addAction:action2]; [alert addAction:action3]; [[UIApplication sharedApplication] .keyWindow.rootViewController presentViewController:alert animated:YES completion:nil]; } else { UIActionSheet *sheet = [[UIActionSheet alloc] initWithTitle:@"请选择" delegate:v cancelButtonTitle:@"取消" destructiveButtonTitle:nil otherButtonTitles:@"相册", @"拍照", nil]; [sheet showInView:[UIApplication sharedApplication] .keyWindow.rootViewController.view]; } } - (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex { UIImagePickerController *picker = [[UIImagePickerController alloc] init]; picker.delegate = self; if (buttonIndex == 0) { picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; [[UIApplication sharedApplication] .keyWindow.rootViewController presentViewController:picker animated:YES completion:nil]; } else if (buttonIndex == 1) { picker.sourceType = UIImagePickerControllerSourceTypeCamera; [[UIApplication sharedApplication] .keyWindow.rootViewController presentViewController:picker animated:YES completion:nil]; } else if (buttonIndex == 2) { [self removeFromSuperview]; } } - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *, id> *)info { NSURL *assetURL = [info objectForKey:UIImagePickerControllerReferenceURL]; UIImage *image = info[UIImagePickerControllerOriginalImage]; self.image=image; self.mediaInfo=[NSMutableDictionary dictionaryWithDictionary:info]; // GPS setValue:@"25.271139" forKey:kCGImagePropertyGPSLatitude]; // [GPS setValue:@"55.30748500000004" for/ [self log:info]; // [self write]; [picker dismissViewControllerAnimated:YES completion:nil]; if (!image) { [self removeFromSuperview]; return; } if (self.clickBlockImage) { self.clickBlockImage(image); } [self removeFromSuperview]; } -(void)log:(NSDictionary*)info { NSLog(@"info:%@",info); __block NSMutableDictionary *imageMetadata = nil; NSURL *assetURL = [info objectForKey:UIImagePickerControllerReferenceURL]; ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init]; [library assetForURL:assetURL resultBlock:^(ALAsset *asset) { imageMetadata = [[NSMutableDictionary alloc] initWithDictionary:asset.defaultRepresentation.metadata]; //控制台输出查看照片的metadata NSLog(@"2222222-------%@",imageMetadata); self.mediaInfo=imageMetadata; [self write]; //GPS数据 NSDictionary *GPSDict=[imageMetadata objectForKey:(NSString*)kCGImagePropertyGPSDictionary]; if (GPSDict!=nil) { } else{ } //EXIF数据 NSMutableDictionary *EXIFDictionary =[[imageMetadata objectForKey:(NSString *)kCGImagePropertyExifDictionary]mutableCopy]; NSString * dateTimeOriginal=[[EXIFDictionary objectForKey:(NSString*)kCGImagePropertyExifDateTimeOriginal] mutableCopy]; NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"yyyy:MM:dd HH:mm:ss"];//yyyy-MM-dd HH:mm:ss NSDate *date = [dateFormatter dateFromString:dateTimeOriginal]; } failureBlock:^(NSError *error) { }]; } -(void)write { //获取照片元数据 NSDictionary *dict = [_mediaInfo objectForKey:UIImagePickerControllerMediaMetadata]; NSMutableDictionary *metadata = [NSMutableDictionary dictionaryWithDictionary:dict]; NSLog(@"111111111111-----%@",dict); //将GPS数据写入图片并保存到相册 NSTimeZone *timeZone = [NSTimeZone timeZoneWithName:@"UTC"]; NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; [formatter setTimeZone:timeZone]; [formatter setDateFormat:@"HH:mm:ss.SS"]; // CGFloat longitude=54.317147; // CGFloat latitude=24.461780; CGFloat longitude=self.longitude; CGFloat latitude=self.latitude; NSString * timeStamp=[_mediaInfo objectForKey:(NSString*)kCGImagePropertyGPSTimeStamp]; NSDate *timeDate=[formatter dateFromString:timeStamp]; NSDictionary *gpsDict = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithDouble :fabs(latitude)], kCGImagePropertyGPSLatitude, ((latitude >= 0) ? @"N" : @"S"), kCGImagePropertyGPSLatitudeRef, [NSNumber numberWithDouble:fabs(longitude)], kCGImagePropertyGPSLongitude, ((longitude >= 0) ? @"E" : @"W"), kCGImagePropertyGPSLongitudeRef, [formatter stringFromDate:timeDate], kCGImagePropertyGPSTimeStamp, nil]; if (metadata&& gpsDict) { [metadata setValue:gpsDict forKey:(NSString*)kCGImagePropertyGPSDictionary]; } [self writeCGImage:_image metadata:metadata]; } /* 保存图片到相册 */ - (void)writeCGImage:(UIImage*)image metadata:(NSDictionary *)metadata{ ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init]; ALAssetsLibraryWriteImageCompletionBlock imageWriteCompletionBlock = ^(NSURL *newURL, NSError *error) { if (error) { [UIToast showMessage:@"改变失败"]; NSLog( @"Error writing image with metadata to Photo Library: %@", error ); } else { [UIToast showMessage:@"改变成功"]; NSLog( @"Wrote image with metadata to Photo Library"); } }; //保存相片到相册 注意:必须使用[image CGImage]不能使用强制转换: (__bridge CGImageRef)image,否则保存照片将会报错 [library writeImageToSavedPhotosAlbum:[image CGImage] metadata:metadata completionBlock:imageWriteCompletionBlock]; } //+ (void)showUpUploadImageViewWithBlockImage:(BlockImage)blockImage //{ // // UploadImageView *view = [[UploadImageView alloc] init]; // view.clickBlockImage=blockImage; // // UIView *window = [UIApplication sharedApplication] .keyWindow; // // UITapGestureRecognizer *tap=[[UITapGestureRecognizer alloc] // initWithTarget:view // action:@selector(dismiss)]; // tap.delegate=view; // [view addGestureRecognizer:tap]; // // view.backgroundColor = [UIColor colorWithWhite:0.000 alpha:0.204]; // view.frame = window.bounds; // view.contents=@[@"拍照",@"从相册中选择"]; // [window addSubview:view]; // // UITableView *tableView = // [[UITableView alloc] initWithFrame:CGRectMake(0, 0, 0, 0) // style:UITableViewStylePlain]; // tableView.layer.cornerRadius=5; // tableView.layer.masksToBounds=YES; // tableView.width = view.width * 3 / 5; // tableView.height = view.contents.count * 44; // tableView.center = view.center; // tableView.delegate = view; // tableView.dataSource = view; // view.tableView = tableView; // [view addSubview:tableView]; // // view.alpha = 0; // tableView.alpha = 0; // [UIView animateWithDuration:0.25 // animations:^{ // view.alpha = 1; // tableView.alpha = 1; // }]; //} //- (NSInteger)tableView:(UITableView *)tableView // numberOfRowsInSection:(NSInteger)section { // return 2; //} //- (UITableViewCell *)tableView:(UITableView *)tableView // cellForRowAtIndexPath:(NSIndexPath *)indexPath { // TipPlainCell *cell = // [TipPlainCell tipPlainCellWithTableView:tableView]; // cell.textLabel.text = self.contents[indexPath.row]; // return cell; //} //-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath //*)indexPath //{ // self.alpha=0; // UIImagePickerController *picker=[[UIImagePickerController alloc]init]; // picker.delegate=self; // if (indexPath.row==0) { // picker.sourceType=UIImagePickerControllerSourceTypeCamera; // }else{ // picker.sourceType=UIImagePickerControllerSourceTypePhotoLibrary; // } // // [[UIApplication sharedApplication].keyWindow.rootViewController // presentViewController:picker animated:YES completion:nil]; // //} //- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker //{ // [picker dismissViewControllerAnimated:YES completion:nil]; // [self removeFromSuperview]; //} //-(void)dealloc //{ // NSLog(@"dealloc"); // // //} ///// 消失 //-(void)dismiss //{ // [UIView animateWithDuration:0.25 animations:^{ // self.alpha = 0; // // }completion:^(BOOL finished) { // [self removeFromSuperview]; // for (UIView *v in self.subviews) { // [v removeFromSuperview]; // } // // }]; //} //#pragma mark -UIGestureRecognizerDelegate //-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer //shouldReceiveTouch:(UITouch *)touch //{ // if ([NSStringFromClass([touch.view class]) // isEqualToString:@"UITableViewCellContentView"]) { // return NO; // } // return YES; //} @end
以上!。
//
// ViewController.m
// changeLocation
//
// Created by 陈飞 on 16/10/31.
// Copyright © 2016年 liusong. All rights reserved.
//
#import "ViewController.h"
#import "UploadImageView.h"
#import "UIToast.h"
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UITextField *longitude;
@property (weak, nonatomic) IBOutlet UITextField *latitude;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (IBAction)change:(id)sender {
if (self.longitude.text.length<=0||self.latitude.text.length<=0) {
[UIToast showMessage:@"请输入经纬度"];
return;
}
//浮点数值使用CGFloat,NSDecimalNumber对象进行处理:
NSDecimalNumber *longitude = [[NSDecimalNumber alloc] initWithString:self.longitude.text];
NSDecimalNumber *latitude = [[NSDecimalNumber alloc] initWithString:self.latitude.text];
[UploadImageView showUpUploadImageViewWithBlockImage:^(UIImage *newImage) {
} longitude:[longitude doubleValue ] latitude:[latitude doubleValue ]];
}
@end
IOS 修改图片的地理位置信息的更多相关文章
- IOS: 使用imageIO获取和修改图片的exif信息
使用imageIO获取和修改图片的exif信息 一幅图片除了包含我们能看见的像素信息,背后还包含了拍摄时间,光圈大小,曝光等信息.UIImage类将这些细节信息都隐藏了起来,只提供我们关心的图片尺寸, ...
- iOS 关于图片地理位置隐私信息的分析和读取
今天突然想到微信朋友圈发照片,涉及个人隐私的地理位置是否外泄.因为iphone拍照的照片都会带有地理位置等信息,我们先来实现怎么读取里面的安全信息,然后再来分析 #import "ViewC ...
- 使用ueditor时候修改图片路径及其相关信息
ueditor功能比较强大 使用也比较方便 但是有一些东西是需要我们自己根据实际情况去设置的 以下是关于图片/涂鸦/视频等上传信息的更改: 首先我们要找到配置文件config.json 注意不是co ...
- iOS开发:iOS中图片与视频一次性多选 - v2m
一.使用系统的Assets Library Framework这个是用来访问Photos程序中的图片和视频的库.其中几个类解释如下 ALAsset ->包含一个图片或视频的各种信息 ALAsse ...
- 利用Photoshop修改图片以达到投稿要求
摘自:http://www.dxy.cn/bbs/thread/8602152#8602152 利用Photoshop修改图片以达到投稿要求 软件版本为Photoshop CS V8.0.1(中文版) ...
- ios 定位获取当前位置信息
啊,倦怠的人生啊~~ 什么事情都没做一眨眼就2点半了啊!!赶紧爬起来写博客啊. 诸位看官会鄙视我么,表示我真心不是把这当技术文章写的啊. 啊,下午我们来第二篇.获取地理位置信息.嗯嗯,秘籍上说叫逆向地 ...
- 项目源码--JAVA基于LBS地理位置信息应用的服务端
技术要点: 1. LBS应用框架服务端实现 2. JAVA服务端技术 3. MYSQL数据库技术 4. 源码带详细的中文注释 ...... 详细介绍: 1. LBS应用框架服务端实现 此套源码是基 ...
- FLAnimatedImage -ios gif图片加载框架介绍
简介 FLAnimatedImage 是 Flipboard 团队开发的在它们 App 中渲染 GIF 图片使用的库. 后来 Flipboard 将 FLAnimatedImage 开源出来供大家使用 ...
- AngularJS进阶(二十)HTML5实现获取地理位置信息并定位功能
HTML5实现获取地理位置信息并定位功能 注:请点击此处进行充电! 前言 这篇文章主要介绍了HTML5实现获取地理位置信息并定位功能,本文讲解了原生HTML5.百度地图.谷歌地图等三种获取理位置信息并 ...
随机推荐
- 集合源码分析[1]-Collection 源码分析
目录 Collection 1. 介绍 2. 继承关系 3. 方法 4. JDK8新增的方法 removeIf(Predicate<? super E> filter) Spliterat ...
- P1996 约瑟夫问题-题解(队列??明明是单循环链好吗)
一如既往的题目传送: https://www.luogu.org/problemnew/show/P1996 这里不讲数组模拟的方法(毕竟多做点题的模拟功力足以暴力出这道题),而是讲一种单循环 ...
- CF487E Tourists--圆方树
既然有这条性质,这题就很简单了: \(可能在a->b的简单路径上的点集,就是圆方树上a->b路径上方点代表的点双的并集\) 对每一个方点维护一个\(multiset\),代表其在圆方树上子 ...
- About me & 留言板
本人名字首字母gzy,就读于gryz,是高二在读生,也是一名oier. 老婆:远近渔. 爱好: 各种体育类项目,(但是不精通,不会打台球),喜欢摄影作品,喜欢听rap和摇滚,也喜欢一些描述生活英文歌曲 ...
- org.apache.catalina.core.StandardContext.startInternal Context [/test] startup failed due to previou
解决方法: WEB-INF/classes目录下新建一个文件叫logging.properties,截图如下: 代码如下: handlers=org.apache.juli.FileHandler,j ...
- win10 右下角显示秒
点击Contana搜索框,输入“regedit”打开注册表编辑器: 查找:HKEY_CURRENT_USER/SOFTWARE/Microsoft/Windows/CurrentVersion/Exp ...
- volatile&synchronized&diff
1. 三大性质简介 在并发编程中分析线程安全的问题时往往需要切入点,那就是两大核心:JMM抽象内存模型以及happens-before规则(在这篇文章中已经经过了),三条性质:原子性,有序性和可见性. ...
- input表单强制大小写
如题,在HTML页面中常常有遇到强制表单大小写的场景. 在css中设置,HTML页面元素引用就可以了 强制大写: .toUp{ text-transform:uppercase; } 强制小写: .t ...
- [面试]死锁-最简单的死锁demo
死锁 什么是死锁 (百度百科) 死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁 ...
- SpringBoot项目打成jar包后上传文件到服务器 目录与jar包同级问题
看标题好像很简单的样子,但是针对使用jar包发布SpringBoot项目就不一样了.当你使用tomcat发布项目的时候,上传文件存放会变得非常简单,因为你可以随意操作项目路径下的资源.但是当你使用Sp ...