iOS开发 使用UIImagePicker从相机或相册获取图片并裁剪

今天遇到一个用户头像上传的问题,需要从相册或者相机中读取图片。代码很简单,抽取关键部分,如下:

[cpp]  view plain  copy
  1. //load user image  
  2. - (void)UesrImageClicked  
  3. {  
  4.     UIActionSheet *sheet;  
  5.       
  6.     // 判断是否支持相机  
  7.     if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera])  
  8.     {  
  9.         sheet  = [[UIActionSheet alloc] initWithTitle:@"选择图像" delegate:self cancelButtonTitle:nil destructiveButtonTitle:@"取消" otherButtonTitles:@"拍照", @"从相册选择", nil];  
  10.     }  
  11.     else {  
  12.         sheet = [[UIActionSheet alloc] initWithTitle:@"选择图像" delegate:self cancelButtonTitle:nil destructiveButtonTitle:@"取消" otherButtonTitles:@"从相册选择", nil];  
  13.     }  
  14.       
  15.     sheet.tag = 255;  
  16.       
  17.     [sheet showInView:self.view];  
  18. }  
  19.   
  20.   
  21. #pragma mark - action sheet delegte  
  22. - (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex  
  23. {  
  24.     if (actionSheet.tag == 255) {  
  25.         NSUInteger sourceType = UIImagePickerControllerSourceTypePhotoLibrary;  
  26.         // 判断是否支持相机  
  27.         if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {  
  28.             switch (buttonIndex) {  
  29.                 case 0:  
  30.                     return;  
  31.                 case 1: //相机  
  32.                     sourceType = UIImagePickerControllerSourceTypeCamera;  
  33.                     break;  
  34.                 case 2: //相册  
  35.                     sourceType = UIImagePickerControllerSourceTypePhotoLibrary;  
  36.                     break;  
  37.             }  
  38.         }  
  39.         else {  
  40.             if (buttonIndex == 0) {  
  41.                 return;  
  42.             } else {  
  43.                 sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum;  
  44.             }  
  45.         }  
  46.         // 跳转到相机或相册页面  
  47.         UIImagePickerController *imagePickerController = [[UIImagePickerController alloc] init];  
  48.         imagePickerController.delegate = self;  
  49.         imagePickerController.allowsEditing = YES;  
  50.         imagePickerController.sourceType = sourceType;  
  51.           
  52.         [self presentViewController:imagePickerController animated:YES completion:^{}];  
  53.     }  
  54. }  
  55.   
  56. #pragma mark - image picker delegte  
  57. - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info  
  58. {  
  59.     [picker dismissViewControllerAnimated:YES completion:^{}];  
  60.       
  61.     UIImage *image = [info UIImagePickerControllerOriginalImage];      
  62.     userImageView.image = image;  
  63.       
  64.     NSData *imageData = UIImageJPEGRepresentation(image, COMPRESSED_RATE);  
  65.     UIImage *compressedImage = [UIImage imageWithData:imageData];  
  66.       
  67.     [HttpRequestManager uploadImage:compressedImage httpClient:self.httpClient delegate:self];  
  68.       
  69. }  


创建一张表单,选择相机或者相册,然后用回调函数处理返回的图片。


但是返回的图像并不是正方形,显示在用户头像的View里面产生明显的拉伸。研究了很久各种裁剪算法,甚至想创建一个view来处理。突然发现代码中从相机、相册获取图片时采用的的

UIImagePickerControllerOriginalImage

于是跟踪进去一看:

UIKIT_EXTERN NSString *const UIImagePickerControllerMediaType;      // an NSString (UTI, i.e. kUTTypeImage)

UIKIT_EXTERN NSString *const UIImagePickerControllerOriginalImage;  // a UIImage

UIKIT_EXTERN NSString *const UIImagePickerControllerEditedImage;    // a UIImage

UIKIT_EXTERN NSString *const UIImagePickerControllerCropRect;       // an NSValue (CGRect)

UIKIT_EXTERN NSString *const UIImagePickerControllerMediaURL;       // an NSURL

UIKIT_EXTERN NSString *const UIImagePickerControllerReferenceURL        NS_AVAILABLE_IOS(4_1); // an NSURL that references an 


恍然大悟,很简单,用UIImagePickerControllerEditedImage,万事搞定。


原文链接:http://blog.csdn.net/lrenjun/article/details/9253577

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值