IOS开发之拍照、从相册选图并对图片进行裁剪
白羽 2018-06-15 来源 :网络 阅读 5494 评论 0

摘要:本文将带你了解IOS开发之拍照、从相册选图并对图片进行裁剪,希望本文对大家学IOS有所帮助。


 

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

 IOS开发之拍照、从相册选图并对图片进行裁剪

 

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

 IOS开发之拍照、从相册选图并对图片进行裁剪

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

 

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

 

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

[cpp] view plain copy

1. #import <Foundation/Foundation.h>  

2.   

3. @protocol PassImageDelegate <NSObject>  

4.   

5. -(void)passImage:(UIImage *)image;  

6.   

7. @end  


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

[cpp] view plain copy

1. - (void)viewDidLoad  

2. {  

3.     [super viewDidLoad];  

4.       

5.     //添加导航栏和完成按钮  

6.     UINavigationBar *naviBar = [[UINavigationBar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)];  

7.     [self.view addSubview:naviBar];  

8.       

9.     UINavigationItem *naviItem = [[UINavigationItem alloc] initWithTitle:@"图片裁剪"];  

10.     [naviBar pushNavigationItem:naviItem animated:YES];  

11.       

12.     //保存按钮  

13.     UIBarButtonItem *doneItem = [[UIBarButtonItem alloc] initWithTitle:@"Done" style:UIBarButtonItemStylePlain target:self action:@selector(saveButton)];  

14.     naviItem.rightBarButtonItem = doneItem;  

15.       

16.     //image为上一个界面传过来的图片资源  

17.     editorView = [[AGSimpleImageEditorView alloc] initWithImage:self.image];  

18.     editorView.frame = CGRectMake(0, 0, self.view.frame.size.width ,  self.view.frame.size.width);  

19.     editorView.center = self.view.center;  

20.       

21.     //外边框的宽度及颜色  

22.     editorView.borderWidth = 1.f;  

23.     editorView.borderColor = [UIColor blackColor];  

24.       

25.     //截取框的宽度及颜色  

26.     editorView.ratioViewBorderWidth = 5.f;  

27.     editorView.ratioViewBorderColor = [UIColor orangeColor];  

28.       

29.     //截取比例,我这里按正方形1:1截取(可以写成 3./2. 16./9. 4./3.)  

30.     editorView.ratio = 1;  

31.       

32.     [self.view addSubview:editorView];  

33. }  

34.   

35. //完成截取  

36. -(void)saveButton  

37. {  

38.     //output为截取后的图片,UIImage类型  

39.     UIImage *resultImage = editorView.output;  

40.       

41.     //通过代理回传给上一个界面显示  

42.     [self.delegate passImage:resultImage];  

43.       

44.     [self dismissModalViewControllerAnimated:YES];  

45. }  


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

[cpp] view plain copy

1. //弹出选项列表选择图片来源  

2. - (IBAction)choseButtonClicked:(id)sender {  

3.     UIActionSheet *chooseImageSheet = [[UIActionSheet alloc] initWithTitle:nil delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:nil otherButtonTitles:@"Camera",@"Photo library", nil];  

4.     [chooseImageSheet showInView:self.view];  

5. }  

6.   

7. #pragma mark UIActionSheetDelegate Method  

8. -(void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex  

9. {  

10.     UIImagePickerController * picker = [[UIImagePickerController alloc] init];  

11.     picker.delegate = self;  

12.       

13.     switch (buttonIndex) {  

14.         case 0://Take picture  

15.               

16.             if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {  

17.                 picker.sourceType = UIImagePickerControllerSourceTypeCamera;  

18.                   

19.             }else{  

20.                 NSLog(@"模拟器无法打开相机");  

21.             }  

22.             [self presentModalViewController:picker animated:YES];  

23.             break;  

24.               

25.         case 1://From album  

26.             picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;  

27.             [self presentModalViewController:picker animated:YES];  

28.             break;  

29.               

30.         default:  

31.               

32.             break;  

33.     }  

34. }  


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

[cpp] view plain copy

1. #pragma 拍照选择照片协议方法  

2. -(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info  

3. {  

4.       

5.     [UIApplication sharedApplication].statusBarHidden = NO;  

6.       

7.     NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType];  

8.       

9.     NSData *data;  

10.       

11.     if ([mediaType isEqualToString:@"public.image"]){  

12.           

13.         //切忌不可直接使用originImage,因为这是没有经过格式化的图片数据,可能会导致选择的图片颠倒或是失真等现象的发生,从UIImagePickerControllerOriginalImage中的Origin可以看出,很原始,哈哈  

14.         UIImage *originImage = [info objectForKey:UIImagePickerControllerOriginalImage];  

15.           

16.         //图片压缩,因为原图都是很大的,不必要传原图  

17.         UIImage *scaleImage = [self scaleImage:originImage toScale:0.3];  

18.           

19.         //以下这两步都是比较耗时的操作,最好开一个HUD提示用户,这样体验会好些,不至于阻塞界面  

20.         if (UIImagePNGRepresentation(scaleImage) == nil) {  

21.             //将图片转换为JPG格式的二进制数据  

22.             data = UIImageJPEGRepresentation(scaleImage, 1);  

23.         } else {  

24.             //将图片转换为PNG格式的二进制数据  

25.             data = UIImagePNGRepresentation(scaleImage);  

26.         }  

27.           

28.         //将二进制数据生成UIImage  

29.         UIImage *image = [UIImage imageWithData:data];  

30.           

31.         //将图片传递给截取界面进行截取并设置回调方法(协议)  

32.         CaptureViewController *captureView = [[CaptureViewController alloc] init];  

33.         captureView.delegate = self;  

34.         captureView.image = image;  

35.         //隐藏UIImagePickerController本身的导航栏  

36.         picker.navigationBar.hidden = YES;  

37.         [picker pushViewController:captureView animated:YES];  

38.           

39.     }  

40. }  


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

[cpp] view plain copy

1. #pragma mark - 图片回传协议方法  

2. -(void)passImage:(UIImage *)image  

3. {  

4.     //将截取的图片显示在主界面  

5.     imageView.image = image;  

6. }  


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

[cpp] view plain copy

1. #pragma mark- 缩放图片  

2. -(UIImage *)scaleImage:(UIImage *)image toScale:(float)scaleSize  

3. {  

4.     UIGraphicsBeginImageContext(CGSizeMake(image.size.width*scaleSize,image.size.height*scaleSize));  

5.     [image drawInRect:CGRectMake(0, 0, image.size.width * scaleSize, image.size.height *scaleSize)];  

6.     UIImage *scaledImage = UIGraphicsGetImageFromCurrentImageContext();  

7.     UIGraphicsEndImageContext();  

8.     return scaledImage;  

9. }  


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

                        

 IOS开发之拍照、从相册选图并对图片进行裁剪


IOS开发之拍照、从相册选图并对图片进行裁剪


                        

 

 

 


本文由 @白羽 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 1
看完这篇文章有何感觉?已经有1人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程