`
dcj3sjt126com
  • 浏览: 1867066 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

    博客分类:
  • IOS
 
阅读更多

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部分代码如下:

 

  1. #import <Foundation/Foundation.h>  
  2.   
  3. @protocol PassImageDelegate <NSObject>  
  4.   
  5. -(void)passImage:(UIImage *)image;  
  6.   
  7. @end  


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

 

 

  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.主界面打开选项列表并选择拍照或是从相册选择图片代码:

 

 

  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. }  


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

 

 

  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. }  


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

 

 

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


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

 

 

  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. }  


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

 

                        

 

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

                        

 

 

工程下载:Demo源码

 

分享到:
评论

相关推荐

    拍照和相册选取图片并裁剪得到路径

    "拍照和相册选取图片并裁剪得到路径"这个功能是移动应用中常见的一个模块,涉及到Android和iOS系统的多媒体处理、权限管理以及网络上传等多个知识点。 1. **多媒体权限管理**: 在Android 6.0(API级别23)及以上...

    Android 通过拍照或相册选择图片并裁剪(精简版)

    在Android开发中,用户可能需要从手机的相机或者相册中选择图片,并进行裁剪以适应特定的需求。本文将详细讲解如何实现这一功能,提供一个精简且完整的解决方案。 首先,我们需要添加必要的权限到AndroidManifest....

    拍照/相册/裁剪图片

    用户可能需要通过应用直接拍摄新照片,或者从设备相册中选择已有的图片,并对其进行裁剪以适应特定的需求。在实际开发过程中,可能会遇到各种设备兼容性问题,比如在小米手机上裁剪图片时出现闪退的情况。针对这个...

    拍照 / 从相册读取图片后裁剪的范例

    本示例主要涉及了两个关键操作:拍照和从相册读取图片,以及后续的图片裁剪功能。下面我们将详细探讨这些知识点。 首先,拍照功能通常是通过调用设备的相机API来实现的。在Android平台上,可以使用`Intent.ACTION_...

    Android 相机 或者 相册 获取图片裁剪 适用6.0/7.0

    在Android平台上,从相机或相册获取图片并进行裁剪是一项常见的需求,特别是在开发与图像处理相关的应用时。本文将详细讲解如何在Android 6.0(Marshmallow)和7.0(Nougat)系统上实现这个功能,以及如何处理权限...

    选择图片,拍照或从相机选择并裁剪图片

    在IT行业中,尤其是在移动应用开发领域,用户常常需要选择、拍摄或者从相册中选取图片,并对其进行裁剪以适应特定的需求。本知识点主要探讨如何在应用程序中实现这一功能,涉及的技术点包括图片选择、相机调用、图片...

    Android从照相机和相册中获取图片并且裁剪

    以上就是Android从相机和相册获取图片并进行裁剪的基本流程和注意事项。通过这些步骤,开发者可以构建出一个完整的图片获取和裁剪功能,提升应用的用户体验。在实际项目中,还可以根据需求进一步优化,例如添加多图...

    拍照和相册选取图片加裁剪源码

    总之,“拍照和相册选取图片加裁剪源码”是一个实用的工具,它简化了移动应用中常见图片操作的实现,无论是对新手还是经验丰富的开发者来说,都是一个值得参考和学习的资源。如果你正在开发一个需要处理图片的应用,...

    android相机拍照,存储 调用相册, 图片旋转,裁剪

    在Android开发中,涉及到相机拍照、图片存储、调用相册、图片旋转和裁剪等是常见的功能需求。这些功能的实现涉及到多个Android系统API的使用,包括相机API、文件I/O、媒体库以及图像处理库。下面我们将详细探讨这些...

    Android拍照与相册图片裁剪

    在Android应用开发中,"Android拍照与相册图片裁剪"是一个常见的功能需求,涉及到用户交互和权限管理等多个方面。以下将详细阐述实现这一功能的关键知识点: 1. **请求相机权限**:在Android 6.0(API级别23)及...

    Android选择相册拍照裁剪图片完美效果

    在Android应用开发中,用户可能需要从相册中选择图片或者直接通过相机拍照,并进行后续的裁剪操作。为了提供良好的用户体验,确保裁剪过程不会导致图像失真或变形,开发者需要掌握一些关键的技术点。以下是对这个...

    andorid下从相册选取/拍照选取一张相片并剪切

    在Android开发中,用户经常需要从相册...以上就是Android下从相册选取或拍照选取一张相片并进行剪切的主要步骤和涉及的关键知识点。在实际开发中,还需要注意异常处理、用户体验优化以及适配不同Android版本等问题。

    Android调用系统相机和相册并裁剪图片

    以上就是Android中调用系统相机拍照、从相册选择图片以及裁剪图片的基本实现。在实际开发中,还需要考虑权限管理(如请求存储权限)、图片压缩、异步处理等细节问题,以确保功能的完整性和用户体验。同时,由于...

    android 自定义比例裁剪图片(拍照 相册)方式 16:9 10:7 自定义

    本篇文章将详细讲解如何在Android应用中实现自定义比例的图片裁剪,包括从相机拍照和相册选取图片后进行裁剪,并重点介绍16:9和10:7这两种常见比例的裁剪方法。 首先,我们需要了解Android中的Intent机制,它是...

    从相册选择图片及拍照及裁剪及6.0权限适配

    在Android应用开发中,用户可能需要进行各种与图像相关的操作,比如从相册选取图片、拍照、以及对图片进行裁剪。这些功能是许多社交、电商或者个人化应用的常见需求。本文将详细讲解如何在Android中实现这些功能,并...

    Android 头像(拍照,相册)选择后裁剪后使用

    在Android应用开发中,用户头像的设置是一个常见的需求,用户可能需要从相机或相册选取照片,并对其进行裁剪以适应应用的特定显示要求。这个功能涉及到多个Android SDK中的组件和API,包括Intent、Bitmap、Uri以及...

    拍照和相册图片的裁剪

    在Android开发中,拍照和处理相册中的图片是常见的功能之一,而图片裁剪则是这一环节中的关键步骤。本文将详细讲解如何在Android应用中实现图片裁剪功能,结合提供的"Android_camera2"示例,我们将深入探讨Android ...

    swift-一款自定义多选相册单张图片编辑旋转裁剪功能

    "swift-一款自定义多选相册单张图片编辑旋转裁剪功能"的项目旨在提供一个自定义的相册组件,它允许用户进行多选图片,并对单个图片进行编辑,包括旋转和裁剪操作。这一功能对于社交应用、图片编辑应用或者任何需要...

    图片选择(拍照,相册,裁剪)

    本文将深入探讨如何实现“图片选择(拍照,相册,裁剪)”这一功能,并针对描述中遇到的MIUI系统崩溃问题进行分析。 首先,我们需要提供用户两种图片获取方式:从相册选择和直接拍照。这通常通过调用系统相机和图库...

    mui拍照,相册选择裁剪上传图片

    "mui拍照,相册选择裁剪上传图片"这个主题涉及了移动应用中图像处理的几个关键步骤:拍照、选择相册图片、图片裁剪以及图片上传。下面将详细介绍这些知识点。 1. **MUI框架**: MUI是DCloud(多端开发云)推出的一...

Global site tag (gtag.js) - Google Analytics