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.百度地图.谷歌地图等三种获取理位置信息并 ...
随机推荐
- 使用Excel VBA编程将网点的百度坐标转换后标注到高德地图上
公司网点表存储的坐标是百度坐标,现需要将网点位置标注到高德地图上,研究了一下高德地图的云图数据模版 http://lbs.amap.com/yuntu/reference/cloudstorage和坐 ...
- win10更改无线网卡的MAC地址
https://blog.csdn.net/qq_31778495/article/details/80932472 前段时间电脑蹭网被禁了MAC地址,故寻找修改MAC地址的方法. 本机配置: win ...
- 什么是MIPI
随着客户要求手机摄像头像素越来越高同时要求高的传输速度传统的并口传输越来越受到挑战.提高并口传输的输出时钟是一个办法但会导致系统的EMC设计变得越来困难,增加传输线的位数是但是这又不符合小型化 ...
- JMeter的介绍和简单使用
Apache官网(https://jmeter.apache.org/)对JMeter的解释: Apache JMeter™ Apache JMeter™应用程序是开源软件, 为负载功能和性能测试 ...
- C语言 变量的作用域和生命周期(转)
转自 https://blog.csdn.net/u011616739/article/details/62052179 a.普通局部变量 属于某个{},在{}外部不能使用此变量,在{}内部是可以使用 ...
- Virtualbox Ubuntu 虚拟机命令行挂载共享文件夹及设置静态IP
挂载共享文件夹 参考 [1], VirtualBox/GuestAdditions [2], VirtualBox/SharedFolders 步骤 在Virtualbox 虚拟机的菜单『设备』中,点 ...
- 提高MYSQL大数据量查询的速度
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...
- cv::Mat类之type成员
CV_8UC3 -->16 CV_8UC3 表示存储元素的数据类型为 8bit unsigned char 类型,通道数C = 3 为什么OpenCV中type为CV_8UC3的图像 输出其ty ...
- LeetCode第十五题-找出数组中三数和为0的答案
3Sum 问题简介: 给定n个整数的数组nums,是否有元素a,b,c在nums中,使a + b + c = 0? 找到数组中所有唯一的三元组,它们的总和为零 注:解决方案集不得包含重复的三元组 例如 ...
- 强大的Resharp插件(转)
使用VS有段时间了,一直深深的折服于其强大的功能.之前一直听说有Resharp这个工具,小猪一直也没有太在意.直到今天…… 下载安装: http://www.jetbrains.com/resharp ...