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 picture
- if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
- picker.sourceType = UIImagePickerControllerSourceTypeCamera;
- }else{
- NSLog(@"模拟器无法打开相机");
- }
- [self presentModalViewController:picker animated:YES];
- break;
- case 1://From album
- picker.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);
- }
- //将二进制数据生成UIImage
- UIImage *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;
- }
完成后到真机上运行,效果如下:
拍照后选择图片后进入到裁剪界面,裁剪完成后显示裁剪结果:
工程下载:Demo源码
相关推荐
拍照和相册选取图片并裁剪得到路径上传服务器
可以实现从相册或者相机拍照,选择图片,并裁剪图片
通过拍照或相册选择图片并裁剪(虽然网上有很多,但我的这个相对来说精简、完整)
拍照、从相册读取图片后裁剪的范例,相关博文:http://www.cnblogs.com/tianzhijiexian/p/3989296.html
Android从照相机和相册中获取图片并且裁剪,给大家分享
调用系统相机拍照和相册选择图片,然后裁剪图片
Android使用相机拍照与相册获取图片,进行裁剪返回裁剪好的图片,适配Android6、Android7、以及Android10以上不同方式。解决版本不兼容问题。
最近在公司做一个APP,想要实现拍照或则相册裁剪图片的功能,处理了小米裁剪时闪退. http://blog.csdn.net/qq_30552993/article/details/51718931
android相机拍照,存储 调用相册, 图片旋转,裁剪
android7.0拍照或相册选择照片并裁剪 如果您觉得我的代码还行,并使用我的代码,请给我的资源5星评价,这是对我最大的支持。也让更多的android开发者可以用到。 感谢郭霖,感谢...
Android选择相册拍照裁剪图片完美效果,防止裁剪使相册照片变形!
修复部分bug,完善在fragment使用时不能回调到fragment中onActivityResult方法的问题。
IOS 相机 或者 相册 获取图片裁剪 IOS 相机 或者 相册 获取图片裁剪 IOS 相机 或者 相册 获取图片裁剪 https://blog.csdn.net/nicepainkiller/article/details/79732806
Android拍照、相册 获取图片后,裁剪图片
功能:从拍照,相册选择图片后 裁剪局部使用,简单,导入可用
拍照,选择图片,以及选择裁剪功能的实现,并兼容6.0权限。
相册 拍照 获取图片 并裁剪 完美解决 6.0适配 最新的版本,本demo综合了http://download.csdn.net/user/syif88 和 https://github.com/jdamcd/android-crop两个demo,完美解决了在6.0以上获取系统裁剪相册错误问题,...
这是一个简单的相册选取照片和拍照功能,并且有裁剪功能,代码少功能强大,需要的自己看一下!
android 自定义比例裁剪图片(拍照 相册)方式 16:9 10:7 自定义 默认宽度是屏幕宽度
andorid下从相册选取/拍照选取一张相片并剪切