直接上代码:

//
//  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 修改图片的地理位置信息的更多相关文章

  1. IOS: 使用imageIO获取和修改图片的exif信息

    使用imageIO获取和修改图片的exif信息 一幅图片除了包含我们能看见的像素信息,背后还包含了拍摄时间,光圈大小,曝光等信息.UIImage类将这些细节信息都隐藏了起来,只提供我们关心的图片尺寸, ...

  2. iOS 关于图片地理位置隐私信息的分析和读取

    今天突然想到微信朋友圈发照片,涉及个人隐私的地理位置是否外泄.因为iphone拍照的照片都会带有地理位置等信息,我们先来实现怎么读取里面的安全信息,然后再来分析 #import "ViewC ...

  3. 使用ueditor时候修改图片路径及其相关信息

    ueditor功能比较强大  使用也比较方便 但是有一些东西是需要我们自己根据实际情况去设置的 以下是关于图片/涂鸦/视频等上传信息的更改: 首先我们要找到配置文件config.json 注意不是co ...

  4. iOS开发:iOS中图片与视频一次性多选 - v2m

    一.使用系统的Assets Library Framework这个是用来访问Photos程序中的图片和视频的库.其中几个类解释如下 ALAsset ->包含一个图片或视频的各种信息 ALAsse ...

  5. 利用Photoshop修改图片以达到投稿要求

    摘自:http://www.dxy.cn/bbs/thread/8602152#8602152 利用Photoshop修改图片以达到投稿要求 软件版本为Photoshop CS V8.0.1(中文版) ...

  6. ios 定位获取当前位置信息

    啊,倦怠的人生啊~~ 什么事情都没做一眨眼就2点半了啊!!赶紧爬起来写博客啊. 诸位看官会鄙视我么,表示我真心不是把这当技术文章写的啊. 啊,下午我们来第二篇.获取地理位置信息.嗯嗯,秘籍上说叫逆向地 ...

  7. 项目源码--JAVA基于LBS地理位置信息应用的服务端

    技术要点: 1. LBS应用框架服务端实现 2. JAVA服务端技术 3. MYSQL数据库技术 4. 源码带详细的中文注释 ......   详细介绍: 1. LBS应用框架服务端实现 此套源码是基 ...

  8. FLAnimatedImage -ios gif图片加载框架介绍

    简介 FLAnimatedImage 是 Flipboard 团队开发的在它们 App 中渲染 GIF 图片使用的库. 后来 Flipboard 将 FLAnimatedImage 开源出来供大家使用 ...

  9. AngularJS进阶(二十)HTML5实现获取地理位置信息并定位功能

    HTML5实现获取地理位置信息并定位功能 注:请点击此处进行充电! 前言 这篇文章主要介绍了HTML5实现获取地理位置信息并定位功能,本文讲解了原生HTML5.百度地图.谷歌地图等三种获取理位置信息并 ...

随机推荐

  1. 集合源码分析[1]-Collection 源码分析

    目录 Collection 1. 介绍 2. 继承关系 3. 方法 4. JDK8新增的方法 removeIf(Predicate<? super E> filter) Spliterat ...

  2. P1996 约瑟夫问题-题解(队列??明明是单循环链好吗)

    一如既往的题目传送:     https://www.luogu.org/problemnew/show/P1996 这里不讲数组模拟的方法(毕竟多做点题的模拟功力足以暴力出这道题),而是讲一种单循环 ...

  3. CF487E Tourists--圆方树

    既然有这条性质,这题就很简单了: \(可能在a->b的简单路径上的点集,就是圆方树上a->b路径上方点代表的点双的并集\) 对每一个方点维护一个\(multiset\),代表其在圆方树上子 ...

  4. About me & 留言板

    本人名字首字母gzy,就读于gryz,是高二在读生,也是一名oier. 老婆:远近渔. 爱好: 各种体育类项目,(但是不精通,不会打台球),喜欢摄影作品,喜欢听rap和摇滚,也喜欢一些描述生活英文歌曲 ...

  5. org.apache.catalina.core.StandardContext.startInternal Context [/test] startup failed due to previou

    解决方法: WEB-INF/classes目录下新建一个文件叫logging.properties,截图如下: 代码如下: handlers=org.apache.juli.FileHandler,j ...

  6. win10 右下角显示秒

    点击Contana搜索框,输入“regedit”打开注册表编辑器: 查找:HKEY_CURRENT_USER/SOFTWARE/Microsoft/Windows/CurrentVersion/Exp ...

  7. volatile&synchronized&diff

    1. 三大性质简介 在并发编程中分析线程安全的问题时往往需要切入点,那就是两大核心:JMM抽象内存模型以及happens-before规则(在这篇文章中已经经过了),三条性质:原子性,有序性和可见性. ...

  8. input表单强制大小写

    如题,在HTML页面中常常有遇到强制表单大小写的场景. 在css中设置,HTML页面元素引用就可以了 强制大写: .toUp{ text-transform:uppercase; } 强制小写: .t ...

  9. [面试]死锁-最简单的死锁demo

    死锁 什么是死锁 (百度百科) 死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁 ...

  10. SpringBoot项目打成jar包后上传文件到服务器 目录与jar包同级问题

    看标题好像很简单的样子,但是针对使用jar包发布SpringBoot项目就不一样了.当你使用tomcat发布项目的时候,上传文件存放会变得非常简单,因为你可以随意操作项目路径下的资源.但是当你使用Sp ...