相册、图库、拍照功能的访问以及图像角度设置

在我们需要访问UIImagePickerController的时候,一般为选择图片,此时我们可能需要做如下操作:

一、访问相册、图库、拍照功能;

二、图片设置;

1、需要将选择的图片缩小 (等比例);

2、设置图片的形状 (比如:希望选择的图片为圆形);

3、将图片翻转一定的角度 (比如翻转90度、180度等)

 

以下是我自己的总结的一些方法:

一、访问功能

- (IBAction)changeIconAction:(UITapGestureRecognizer *)sender {
//    UIActionSheet *actionSheet = [[UIActionSheet alloc]initWithTitle:@"选择头像" delegate:self cancelButtonTitle:@"取消" destructiveButtonTitle:nil otherButtonTitles:@"拍照",@"相册",@"图库", nil];
//    [actionSheet showInView:[UIApplication sharedApplication].keyWindow];
    
    UIAlertController *alertController = [UIAlertController alertControllerWithTitle:nil message:nil preferredStyle:UIAlertControllerStyleActionSheet];
    [alertController addAction:[UIAlertAction actionWithTitle:@"拍照" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
        dispatch_async(dispatch_get_main_queue(), ^{
            [self makePhoto];
        });
    }]];
    [alertController addAction:[UIAlertAction actionWithTitle:@"相册" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
        dispatch_async(dispatch_get_main_queue(), ^{
            [self choosePicture];
        });
    }]];
    [alertController addAction:[UIAlertAction actionWithTitle:@"图库" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
        dispatch_async(dispatch_get_main_queue(), ^{
            [self pictureLibrary];
        });
    }]];
    
    [alertController addAction:[UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
    }]];
    
    [self presentViewController:alertController animated:YES completion:nil];
}

//跳转到imagePicker里
- (void)makePhoto{
    pickerController = [[UIImagePickerController alloc] init];
    pickerController.allowsEditing = YES;
    pickerController.delegate = self;
    pickerController.sourceType = UIImagePickerControllerSourceTypeCamera;
    [self presentViewController:pickerController animated:YES completion:nil];
}
//跳转到相册
- (void)choosePicture
{
    pickerController.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum;
    [self presentViewController:pickerController animated:YES completion:nil];
}
//跳转图库
- (void)pictureLibrary
{
    pickerController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
    [self presentViewController:pickerController animated:YES completion:nil];
}
//用户取消退出picker时候调用
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
{
    NSLog(@"%@",picker);
    [pickerController dismissViewControllerAnimated:YES completion:^{
        
    }];
}
//用户选中图片之后的回调
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    
    NSLog(@"%s,info == %@",__func__,info);
    
    UIImage *userImage = [self fixOrientation:[info objectForKey:@"UIImagePickerControllerOriginalImage"]];
    
    userImage = [self scaleImage:userImage toScale:0.3];
    
    //保存图片
//    [self saveImage:userImage name:@"某个特定标示"];
    
    [pickerController dismissViewControllerAnimated:YES completion:^{
        
        
    }];
    [self.headIcon setImage:userImage];
    self.headIcon.contentMode = UIViewContentModeScaleAspectFill;
    self.headIcon.clipsToBounds = YES;
    //照片上传
    [self upDateHeadIcon:userImage];
}
View Code

 

二、图片设置

1、图片缩放

 1 /**
 2  *  对图片进行缩放 (宽高缩放)
 3  *
 4  *  @param image     图片原始对象
 5  *  @param scaleSize 缩放的倍数
 6  *
 7  *  @return 缩放后的图片
 8  */
 9 +(UIImage *)scaleImage:(UIImage *)image toScale:(float)scaleSize{
10     UIGraphicsBeginImageContext(CGSizeMake(image.size.width * scaleSize, image.size.height * scaleSize));
11     [image drawInRect:CGRectMake(0, 0, image.size.width * scaleSize, image.size.height * scaleSize)];
12     UIImage *scaledImage = UIGraphicsGetImageFromCurrentImageContext();
13     UIGraphicsEndImageContext();
14     return scaledImage;
15 }
16 /**
17  *  对图片进行缩放 (容量大小缩至100k以内)
18  *
19  *  @param image 图片对象
20  *  @param scope 图像范围 (scope kb范围内)
21  *
22  *  @return 处理后的图片对象
23  */
24 +(UIImage *)originImage:(UIImage *)image withInScope:(int)scope{
25     //头像 20k   广告 200k
26     
27     NSData *data = UIImageJPEGRepresentation(image, 1.0);
28     if (data.length > scope*1024) {
29         if (data.length > 1024*1024) {  //1M以上
30             data = UIImageJPEGRepresentation(image, 0.1);
31         }
32         else if (data.length > 512*1024) {  //500kb - 1000kb
33             data = UIImageJPEGRepresentation(image, 0.5);
34         }
35         else if (data.length > 200*1024) {  //0.25M - 0.5M
36             data = UIImageJPEGRepresentation(image, 0.9);
37         }
38     }
39     return [UIImage imageWithData:data];
40 }
图片缩放

 

2、显示设置

  2.1、图片合成(两张图片合成一张)

 

  2.2、缩略图

 

3、设置水平方向转动角度

 1 //修正照片方向(手机转90度方向拍照)
 2 - (UIImage *)fixOrientation:(UIImage *)aImage {
 3     
 4     // No-op if the orientation is already correct
 5     if (aImage.imageOrientation == UIImageOrientationUp)
 6         return aImage;
 7     
 8     // We need to calculate the proper transformation to make the image upright.
 9     // We do it in 2 steps: Rotate if Left/Right/Down, and then flip if Mirrored.
10     CGAffineTransform transform = CGAffineTransformIdentity;
11     
12     switch (aImage.imageOrientation) {
13         case UIImageOrientationDown:
14         case UIImageOrientationDownMirrored:
15             transform = CGAffineTransformTranslate(transform, aImage.size.width, aImage.size.height);
16             transform = CGAffineTransformRotate(transform, M_PI);
17             break;
18             
19         case UIImageOrientationLeft:
20         case UIImageOrientationLeftMirrored:
21             transform = CGAffineTransformTranslate(transform, aImage.size.width, 0);
22             transform = CGAffineTransformRotate(transform, M_PI_2);
23             break;
24             
25         case UIImageOrientationRight:
26         case UIImageOrientationRightMirrored:
27             transform = CGAffineTransformTranslate(transform, 0, aImage.size.height);
28             transform = CGAffineTransformRotate(transform, -M_PI_2);
29             break;
30         default:
31             break;
32     }
33     
34     switch (aImage.imageOrientation) {
35         case UIImageOrientationUpMirrored:
36         case UIImageOrientationDownMirrored:
37             transform = CGAffineTransformTranslate(transform, aImage.size.width, 0);
38             transform = CGAffineTransformScale(transform, -1, 1);
39             break;
40             
41         case UIImageOrientationLeftMirrored:
42         case UIImageOrientationRightMirrored:
43             transform = CGAffineTransformTranslate(transform, aImage.size.height, 0);
44             transform = CGAffineTransformScale(transform, -1, 1);
45             break;
46         default:
47             break;
48     }
49     
50     // Now we draw the underlying CGImage into a new context, applying the transform
51     // calculated above.
52     CGContextRef ctx = CGBitmapContextCreate(NULL, aImage.size.width, aImage.size.height,
53                                              CGImageGetBitsPerComponent(aImage.CGImage), 0,
54                                              CGImageGetColorSpace(aImage.CGImage),
55                                              CGImageGetBitmapInfo(aImage.CGImage));
56     CGContextConcatCTM(ctx, transform);
57     switch (aImage.imageOrientation) {
58         case UIImageOrientationLeft:
59         case UIImageOrientationLeftMirrored:
60         case UIImageOrientationRight:
61         case UIImageOrientationRightMirrored:
62             // Grr...
63             CGContextDrawImage(ctx, CGRectMake(0,0,aImage.size.height,aImage.size.width), aImage.CGImage);
64             break;
65             
66         default:
67             CGContextDrawImage(ctx, CGRectMake(0,0,aImage.size.width,aImage.size.height), aImage.CGImage);
68             break;
69     }
70     
71     // And now we just create a new UIImage from the drawing context
72     CGImageRef cgimg = CGBitmapContextCreateImage(ctx);
73     UIImage *img = [UIImage imageWithCGImage:cgimg];
74     CGContextRelease(ctx);
75     CGImageRelease(cgimg);
76     return img;
77 }
图片转动角度

 

posted @ 2017-02-18 00:52  一路脚印走下去  阅读(926)  评论(0编辑  收藏  举报