一、简单的拍照显示,或是从相册中直接选取照片

#import "ViewController.h"

@interface ViewController ()<UIImagePickerControllerDelegate,UINavigationControllerDelegate>{

UIImageView *imageView;

}

@end

@implementation ViewController

- (void)viewDidLoad {

[super viewDidLoad];

imageView = [[UIImageView alloc] initWithFrame:CGRectMake(20, 80, self.view.bounds.size.width-40, 300)];

imageView.backgroundColor = [UIColor grayColor];

[self.view addSubview:imageView];

UIButton *button = [UIButton buttonWithType:(UIButtonTypeCustom)];

button.frame = CGRectMake(100, 400, 100, 50);

button.backgroundColor = [UIColor redColor];

[button setTitle:@"相机" forState:UIControlStateNormal];

[button addTarget:self action:@selector(camera) forControlEvents:UIControlEventTouchUpInside];

[self.view addSubview:button];

UIButton *mButton = [UIButton buttonWithType:(UIButtonTypeCustom)];

mButton.frame = CGRectMake(100, 470, 100, 50);

mButton.backgroundColor = [UIColor redColor];

[mButton setTitle:@"相册" forState:UIControlStateNormal];

[mButton addTarget:self action:@selector(photo) forControlEvents:UIControlEventTouchUpInside];

[self.view addSubview:mButton];

}

- (void)camera {

//判断是否由摄像头

BOOL isCamera = [UIImagePickerController isCameraDeviceAvailable:(UIImagePickerControllerCameraDeviceRear)];

//UIImagePickerControllerCameraDeviceRear后置摄像头

//前置摄像头UIImagePickerControllerCameraDeviceFront

if (!isCamera) {

NSLog(@"没有后置摄像头");

return;

}

UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];

imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;

imagePicker.delegate = self;

imagePicker.editing = YES;//相机照的照片是否允许编辑

[self presentViewController:imagePicker animated:YES completion:^{

}];

}

//调取相册

- (void)photo {

UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];

imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;

imagePicker.delegate = self;

[self presentViewController:imagePicker animated:YES completion:nil];

}

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)image editingInfo:(NSDictionary *)editingInfo {

//选取相册照片

imageView.image = image;

[self dismissViewControllerAnimated:YES completion:nil];

}

@end

  二、在一的基础上得到的照片要保存本地

  1、保存

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)image editingInfo:(NSDictionary *)editingInfo {

[[NSUserDefaults standardUserDefaults] setObject:UIImagePNGRepresentation(image) forKey:@"userImage"];

[self dismissViewControllerAnimated:YES completion:nil];

}

  2、取出

NSData* imageData = [[NSUserDefaults standardUserDefaults] objectForKey:@"userImage"];

UIImage *userImage = [UIImage imageWithData:imageData];

  三、在二中取出的图片是有问题的。

  一幅图片除了包含我们能看见的像素信息,背后还包含了拍摄时间,光圈大小,曝光等信息。UIImage类将这些细节信息都隐藏了起来,只提供我们关心的图片尺寸,图片方向等。用相机拍摄出来的照片含有EXIF信息,UIImage的imageOrientation属性指的就是EXIF中的orientation信息。如果我们忽略orientation信息,而直接对照片进行像素处理或者drawInRect等操作,得到的结果是翻转或者旋转90之后的样子。这是因为我们执行像素处理或者drawInRect等操作之后,imageOrientaion信息被删除了,imageOrientaion被重设为0,造成照片内容和imageOrientaion不匹配。

  目前市面上的大部分数码相机和手机都会内置一个方向感应器,拍出的照片中会写如方向信息,但是通常都只会有前四种方向。这几种Mirrored方向通常都是手机前置摄像头自拍的时候才会设置。

enum {
exifOrientationUp = 1, // UIImageOrientationUp
exifOrientationDown = 3, // UIImageOrientationDown
exifOrientationLeft = 6, // UIImageOrientationLeft
exifOrientationRight = 8, // UIImageOrientationRight // these four exifOrientation does not support by all camera, but IOS support these orientation
exifOrientationUpMirrored = 2, // UIImageOrientationUpMirrored
exifOrientationDownMirrored = 4, // UIImageOrientationDownMirrored
exifOrientationLeftMirrored = 5, // UIImageOrientationLeftMirrored
exifOrientationRightMirrored = 7, // UIImageOrientationRightMirrored
};
typedef NSInteger ExifOrientation;

  所以,在对照片进行保存之后,也需要将imageOrientaion这个代表方向的值保存起来,取出的时候再调整图片的方向。废话不多说了,上代码:

  1、保存

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)image editingInfo:(NSDictionary *)editingInfo {

[[NSUserDefaults standardUserDefaults] setObject:UIImagePNGRepresentation(image) forKey:@"userImage"];

[[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithInteger:image.imageOrientation] forKey:@"userImage_imageOrientation"];

[self dismissViewControllerAnimated:YES completion:nil];

}

  2、取出

NSData* imageData = [[NSUserDefaults standardUserDefaults] objectForKey:@"userImage"];

UIImage *userImage = [UIImage imageWithData:imageData];

NSInteger imageOrientation = [[userDefault objectForKey:@"userImage_imageOrientation"] integerValue];

imageView.image = [self fixOrientationWithImage:userImage AndImageOrientation:imageOrientation];

//根据保存的方向值选择图片

- (UIImage *)fixOrientationWithImage:(UIImage *)aImage AndImageOrientation:(NSInteger)imageOrientation {

if (imageOrientation == UIImageOrientationUp)

return aImage;

CGAffineTransform transform = CGAffineTransformIdentity;

switch (imageOrientation) {

case UIImageOrientationDown:

case UIImageOrientationDownMirrored:

transform = CGAffineTransformTranslate(transform, aImage.size.width, aImage.size.height);

transform = CGAffineTransformRotate(transform, M_PI);

break;

case UIImageOrientationLeft:

case UIImageOrientationLeftMirrored:

transform = CGAffineTransformTranslate(transform, aImage.size.width, 0);

transform = CGAffineTransformRotate(transform, M_PI_2);

break;

case UIImageOrientationRight:

case UIImageOrientationRightMirrored:

transform = CGAffineTransformTranslate(transform, 0, aImage.size.height);

transform = CGAffineTransformRotate(transform, -M_PI_2);

break;

default:

break;

}

switch (imageOrientation) {

case UIImageOrientationUpMirrored:

case UIImageOrientationDownMirrored:

transform = CGAffineTransformTranslate(transform, aImage.size.width, 0);

transform = CGAffineTransformScale(transform, -1, 1);

break;

case UIImageOrientationLeftMirrored:

case UIImageOrientationRightMirrored:

transform = CGAffineTransformTranslate(transform, aImage.size.height, 0);

transform = CGAffineTransformScale(transform, -1, 1);

break;

default:

break;

}

CGContextRef ctx = CGBitmapContextCreate(NULL, aImage.size.width, aImage.size.height,

CGImageGetBitsPerComponent(aImage.CGImage), 0,

CGImageGetColorSpace(aImage.CGImage),

CGImageGetBitmapInfo(aImage.CGImage));

CGContextConcatCTM(ctx, transform);

switch (imageOrientation) {

case UIImageOrientationLeft:

case UIImageOrientationLeftMirrored:

case UIImageOrientationRight:

case UIImageOrientationRightMirrored:

CGContextDrawImage(ctx, CGRectMake(0,0,aImage.size.height,aImage.size.width), aImage.CGImage);

break;

default:

CGContextDrawImage(ctx, CGRectMake(0,0,aImage.size.width,aImage.size.height), aImage.CGImage);

break;

}

CGImageRef cgimg = CGBitmapContextCreateImage(ctx);

UIImage *img = [UIImage imageWithCGImage:cgimg];

CGContextRelease(ctx);

CGImageRelease(cgimg);

return img;

}

iOS开发—— UIImagePickerController获取相册和拍照的更多相关文章

  1. 李洪强iOS开发-网络新闻获取数据思路回顾

    李洪强iOS开发-网络新闻获取数据思路回顾 01 创建一个继承自AFHTTPSessionManager的工具类:LHQNetworkTool 用来发送网络请求获取数据  1.1 定义类方法返回单例对 ...

  2. iOS开发之获取沙盒路径

    iOS开发之沙盒机制(SandBox)具体解说了沙盒的一些机制.在开发中,我们须要对沙盒进行操作.所以我们须要获取到沙盒路径. 沙盒里的目录包含Documents.Library.tmp.这三个目录的 ...

  3. iOS开发之获取系统相册ALAssetLibrary

    注:当你选择看这篇博客时想必你的应用还支持iOS8一下系统,如果你的应用要求最低版本大于iOS8,建议使用PhotoKit框架,效率更高 ALAssetsLibrary包含,ALAssetsLibra ...

  4. iOS开发中获取WiFi相关信息

    iOS 开发中难免会遇到很多与网络方面的判断,这里做个汇总,大多可能是与WiFi相关的. 1.Ping域名.Ping某IP 有 时候可能会遇到ping 某个域名或者ip通不通,再做下一步操作.这里的p ...

  5. android开发之——获取相册图片和路径

    Android开发获取相册图片的方式网上有很多种,这里说一个Android4.4后的方法,因为版本越高,一些老的api就会被弃用,新的api和老的api不兼容,导致出现很多问题. 比如:managed ...

  6. iOS开发中获取视图在屏幕上显示的位置

    在iOS开发中,我们会经常遇到一个问题,例如,点击一个按钮,弹出一个遮罩层,上面显示一个弹框,弹框显示的位置在按钮附近.如果这个按钮的位置相对于屏幕边缘的距离是固定的,那就容易了,可以直接写死位置.可 ...

  7. ios uiimagepickercontroller 选择相册或者拍照上传

    首先需要实现UIImagePickerControllerDelegate 代理 实现其imagePickerController 方法  这里用于选择图片或的拍照回调 //调用相机拍照 或者 图库选 ...

  8. iOS开发——打开手机相册,获取图片

    1.添加代理UIImagePickerControllerDelegate 2.设置点击跳转事件 - (IBAction)picButton:(UIButton *)sender { NSLog(@& ...

  9. Android开发之获取相册照片和获取拍照照片

    在Android的开发过程中,我们可能会读取手机里面的照片或者通过相机拍摄获取照片,这是两种常用的获取图片的方式,在做项目过程中也会经常遇到,下面来介绍一下这两种获取方式.. 1.从本地相册获取照片: ...

随机推荐

  1. iOS客户端开发与Web前端开发

    转载自:http://blog.cnbang.net/tech/1813/不知不觉做iOS客户端开发已经半年多了,了解到iOS客户端开发与Web前端开发的一些异同,写一下. 版本升级.用户角度上看,客 ...

  2. k-Means和KNN算法简述

    k-means 算法 k-means 算法接受输入量 k :然后将n个数据对象划分为 k个聚类以便使得所获得的聚类满足:同一聚类中的对象相似度较高:而不同聚类中的对象相似度较小.聚类相似度是利用各聚类 ...

  3. 忘了SA密码的SQL SERVER

    [暂时还未验证] SQL2008  如果 本地连接登录补上,也忘了Sa等管理账号的密码,可以通过单用户连接的方式登录 http://msdn.microsoft.com/zh-cn/library/m ...

  4. PAT乙1002

    有毒,真的有毒,难题对于简单题影响太大了,想的东西太多,总会在考虑,会不会时间超限,数据量有多大,三个循环就太慢了.... 总之我是真的不愿意看到这样的程序能过的,总觉得有更好的,却总是找不更好的额. ...

  5. opencart配置税率

    1.System->Localisation->Geo Zones新增税收区域 2.System->Localisation->Taxes->Tax Rates新增税率 ...

  6. Django: 之Apache、Nginx部署以及发送邮件

    在这里讲述部署的方法和常见的问题,并给出了在BAE,JAE,SAE等上面部署的实例. Django + nginx + Gunicorn/uwsgi部署方式,参见另一篇:Django部署(nginx) ...

  7. Linux运维常用的命令详解

    1. 查看系统内核版本 [root@funsion geekxa]# cat /etc/issue CentOS release 6.5 (Final) Kernel \r on an \m 显示了系 ...

  8. 排座椅(seat)

    排座椅(seat) 题目描述 上课的时候总有一些同学和前后左右的人交头接耳,这是令小学班主任十分头疼的一件事情.不过,班主任小雪发现了一些有趣的现象,当同学们的座次确定下来之后,只有有限的D对同学上课 ...

  9. java日期格式大全 format SimpleDateFormat(转)

    java日期格式大全 format SimpleDateFormat   /**    * 字符串转换为java.util.Date<br>    * 支持格式为 yyyy.MM.dd G ...

  10. cmd 3389

    1.2000系统 简要说一下如何进行DNS溢出攻击.我用的溢出利用程序是dns.exe,在CMD下运行它可以看到它的使用参数等信息.执行"dns -s IP"命令检测目标IP是否存 ...