2013第一篇,大家新年快乐!感谢一直关注我博客的同学们,有你们的支持我才有动力越做越好!有阵子没写博客了,因为前阵子着实比较忙,没时间整理,今天主要实现一个小Demo,我们知道在Instagram或Path上,头像都是正方形的,得到这种头像图片肯定要对原图进行截取,今天抽时间整理了下,先记录如下!早前写过一篇《IOS学习笔记22—文件操作(NSFileManager)结合相册小例子》,随着iOS SDK的升级,拍照及从相册选取图片的实现过程发生了一点小变化,比如UIImagePickerControllerDelegate的回调方法。现结合一个Demo简要介绍其实现过程。首先,裁剪图片的功能借助了Github上的项目AGSimpleImageEditorView。不多说,一步步的看Demo的实现过程吧:

1.下载Github上这个项目工程到本地并将其拖入到自己的工程中(前提是你已经建立了工程),由于AGSimpleImageEditorView不支持ARC,所以还要做相应的配置,设置编译器标签-fno-objc-arc:

另外,由于使用到图形处理和图片处理,所以还要另外导入两个库,如下图

完成后,按command+B编译试试,如果没问题,说明工程集成成功了,下面就可以开始编码了,如果不成功,检查一下错误来源,上述步骤是否完整。

代码部分:以下均为关键代码,具体细节没有列举,注释写的非常详细,就不赘述了

2.新建PassImageDelegate协议作为在展示界面和截取界面间传值的代理(这个demo用到两种传值方式,不是很了解的可以参考一下《IOS学习笔记30—两个ViewController间传值(一)》),新建CaptureViewController作为截取图片功能的模块。PassImageDelegate部分代码如下:

#import <Foundation/Foundation.h>@protocol PassImageDelegate <NSObject>-(void)passImage:(UIImage *)image;@end

CaptureViewController.h部分关键代码,主要是初始化截取界面,截取成功后的处理等:

- (void)viewDidLoad
{[super viewDidLoad];//添加导航栏和完成按钮UINavigationBar *naviBar = [[UINavigationBar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)];[self.view addSubview:naviBar];UINavigationItem *naviItem = [[UINavigationItem alloc] initWithTitle:@"图片裁剪"];[naviBar pushNavigationItem:naviItem animated:YES];//保存按钮UIBarButtonItem *doneItem = [[UIBarButtonItem alloc] initWithTitle:@"Done" style:UIBarButtonItemStylePlain target:self action:@selector(saveButton)];naviItem.rightBarButtonItem = doneItem;//image为上一个界面传过来的图片资源editorView = [[AGSimpleImageEditorView alloc] initWithImage:self.image];editorView.frame = CGRectMake(0, 0, self.view.frame.size.width ,  self.view.frame.size.width);editorView.center = self.view.center;//外边框的宽度及颜色editorView.borderWidth = 1.f;editorView.borderColor = [UIColor blackColor];//截取框的宽度及颜色editorView.ratioViewBorderWidth = 5.f;editorView.ratioViewBorderColor = [UIColor orangeColor];//截取比例,我这里按正方形1:1截取(可以写成 3./2. 16./9. 4./3.)editorView.ratio = 1;[self.view addSubview:editorView];
}//完成截取
-(void)saveButton
{//output为截取后的图片,UIImage类型UIImage *resultImage = editorView.output;//通过代理回传给上一个界面显示[self.delegate passImage:resultImage];[self dismissModalViewControllerAnimated:YES];
}

3.主界面打开选项列表并选择拍照或是从相册选择图片代码:

//弹出选项列表选择图片来源
- (IBAction)choseButtonClicked:(id)sender {UIActionSheet *chooseImageSheet = [[UIActionSheet alloc] initWithTitle:nil delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:nil otherButtonTitles:@"Camera",@"Photo library", nil];[chooseImageSheet showInView:self.view];
}#pragma mark UIActionSheetDelegate Method
-(void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
{UIImagePickerController * picker = [[UIImagePickerController alloc] init];picker.delegate = self;switch (buttonIndex) {case 0://Take pictureif ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {picker.sourceType = UIImagePickerControllerSourceTypeCamera;}else{NSLog(@"模拟器无法打开相机");}[self presentModalViewController:picker animated:YES];break;case 1://From albumpicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;[self presentModalViewController:picker animated:YES];break;default:break;}
}

拍照或选择图片后的回调方法:

#pragma 拍照选择照片协议方法
-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{[UIApplication sharedApplication].statusBarHidden = NO;NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType];NSData *data;if ([mediaType isEqualToString:@"public.image"]){//切忌不可直接使用originImage,因为这是没有经过格式化的图片数据,可能会导致选择的图片颠倒或是失真等现象的发生,从UIImagePickerControllerOriginalImage中的Origin可以看出,很原始,哈哈UIImage *originImage = [info objectForKey:UIImagePickerControllerOriginalImage];//图片压缩,因为原图都是很大的,不必要传原图UIImage *scaleImage = [self scaleImage:originImage toScale:0.3];//以下这两步都是比较耗时的操作,最好开一个HUD提示用户,这样体验会好些,不至于阻塞界面if (UIImagePNGRepresentation(scaleImage) == nil) {//将图片转换为JPG格式的二进制数据data = UIImageJPEGRepresentation(scaleImage, 1);} else {//将图片转换为PNG格式的二进制数据data = UIImagePNGRepresentation(scaleImage);}//将二进制数据生成UIImageUIImage *image = [UIImage imageWithData:data];//将图片传递给截取界面进行截取并设置回调方法(协议)CaptureViewController *captureView = [[CaptureViewController alloc] init];captureView.delegate = self;captureView.image = image;//隐藏UIImagePickerController本身的导航栏picker.navigationBar.hidden = YES;[picker pushViewController:captureView animated:YES];}
}

回调方法,显示截取后的图片

#pragma mark - 图片回传协议方法
-(void)passImage:(UIImage *)image
{//将截取的图片显示在主界面imageView.image = image;
}

最后就是一段缩放图片的方法:

#pragma mark- 缩放图片
-(UIImage *)scaleImage:(UIImage *)image toScale:(float)scaleSize
{UIGraphicsBeginImageContext(CGSizeMake(image.size.width*scaleSize,image.size.height*scaleSize));[image drawInRect:CGRectMake(0, 0, image.size.width * scaleSize, image.size.height *scaleSize)];UIImage *scaledImage = UIGraphicsGetImageFromCurrentImageContext();UIGraphicsEndImageContext();return scaledImage;
}

完成后到真机上运行,效果如下:

                        

拍照后选择图片后进入到裁剪界面,裁剪完成后显示裁剪结果:

                        

加入我们的QQ群或微信公众账号请查看: Ryan's zone公众账号及QQ群

觉得文章对你有用,欢迎关注我的新浪微博和我交流:@唐韧_Ryan

工程下载:Demo源码

IOS学习笔记39——拍照、从相册选图并对图片进行裁剪相关推荐

  1. 拍照、从相册选图并对图片进行裁剪

    2013第一篇,大家新年快乐!感谢一直关注我博客的同学们,有你们的支持我才有动力越做越好!有阵子没写博客了,因为前阵子着实比较忙,没时间整理,今天主要实现一个小Demo,我们知道在Instagram或 ...

  2. android实现拍照、相册选图、裁剪功能,兼容7.0以及小米

    现在一般的手机应用都会有上传头像的功能,我在实现这个功能的时候遇到很多问题,这里专门记录一下. add 2018/5/10 21:05 先列举一下我出现过的问题: 1.运行时权限 2.调用系统相机拍照 ...

  3. OpenCV for Ios 学习笔记(4)-标记检测1

    本文原始地址:OpenCV for Ios 学习笔记(4)-标记检测1 简单的标记经常是以白色块和黑色块构成的规则图形.因为我们预先知道这些因素,所以我们可以很容易检测标记. 如图: 首先,我们需要找 ...

  4. IOS学习笔记(九)之UIAlertView(警告视图)和UIActionSheet(操作表视图)基本概念和使用方法...

    IOS学习笔记(九)之UIAlertView(警告视图)和UIActionSheet(操作表视图)基本概念和使用方法 Author:hmjiangqq Email:jiangqqlmj@163.com ...

  5. IOS学习笔记(四)之UITextField和UITextView控件学习

    IOS学习笔记(四)之UITextField和UITextView控件学习(博客地址:http://blog.csdn.net/developer_jiangqq) Author:hmjiangqq ...

  6. iOS学习笔记-自己动手写RESideMenu

    代码地址如下: http://www.demodashi.com/demo/11683.html 很多app都实现了类似RESideMenu的效果,RESideMenu是Github上面一个stars ...

  7. iOS学习笔记-地图MapKit入门

    代码地址如下: http://www.demodashi.com/demo/11682.html 这篇文章还是翻译自raywenderlich,用Objective-C改写了代码.没有逐字翻译,如有错 ...

  8. iOS学习笔记-自定义过渡动画

    代码地址如下: http://www.demodashi.com/demo/11678.html 这篇笔记翻译自raywenderlick网站的过渡动画的一篇文章,原文用的swift,由于考虑到swi ...

  9. IOS学习笔记07---C语言函数-scanf函数

    2013/8/7 IOS学习笔记07---C语言函数-scanf函数 ------------------------------ qq交流群:创梦技术交流群:251572072            ...

最新文章

  1. L 1 ,L 2 参数正则化
  2. 关于Unable to instantiate activity ComponentInfo错误解决方案
  3. rxjs 操作符 pairwise 的一个例子
  4. ssl1335-最佳派对【二分图,最大匹配,图论】
  5. ogc是一个非营利性组织_非营利组织的软件资源
  6. Linux makefile 教程 很具体,且易懂
  7. php cookie安全,php通过header设置cookie的安全
  8. 浅谈js与jq给新增元素动态绑定事件(事件委托)
  9. c语言实现sbrk函数,菜鸟随笔(2)---brk()与sbrk()函数的学习与使用
  10. 服务器异常宕机引发的mysql故障
  11. bugku 杂项 部分
  12. 基于pytorch+Resnet101加GPT搭建AI玩王者荣耀
  13. matlab 频域采样定理,信号时域和频域采样函数周期性与原信号的关系
  14. 增强版唐奇安通道策略
  15. 消息对话框(消息盒子)
  16. 【第二节】HTML5小实例
  17. JS——背景色的滑动效果以及输入框的状态切换效果实现
  18. 畅购商城(三):商品管理
  19. iCloud云上贵州,2018数博会连接2亿多用户
  20. 请假系统jsp mysql_[源码和文档分享]基于JSP和MYSQL数据库实现的请假管理系统

热门文章

  1. 游戏是人工智能研究的理想场景
  2. Spring框架的两大核心思想
  3. 什么高大填空四个字动人_大什么什么流四字填空
  4. 虚拟机重复登录无法进入
  5. 腾讯到底是互联网上的模仿者还是潮流的追随者?
  6. Java 覆盖系统类:endorsed 技术
  7. AIX 6.1 安装 Oracle 11.2.0.4 ASM RAC PSU 最佳实践
  8. Stegdetect 0.4 for windows
  9. 华为CDN核心功能测评
  10. parent(),parents(),closet()区别与详解