UIImagePickerController 拍照相册选取照片简单封装

ImagePickerManager.h

#import <Foundation/Foundation.h>

#import<UIKit/UIKit.h>

#import<AVFoundation/AVFoundation.h>

#import<MobileCoreServices/MobileCoreServices.h>

#import<MediaPlayer/MediaPlayer.h>

NS_ASSUME_NONNULL_BEGIN

@interfaceImagePickerManager :NSObject

- (instancetype)initWithViewController:(UIViewController*)VC;

///选择图片的回调block

@property(nonatomic,copy)void(^didSelectImageBlock) (UIImage*image);

/// 相册选择器对象

@property (nonatomic,strong) UIImagePickerController *imagePicker;

///最大视频时长

@property(nonatomic,assign)NSTimeIntervalvideoMaximumDuration;

@property (nonatomic,assign) BOOL isVideo;

@end

ImagePickerManager.m

#import "ImagePickerManager.h"

@interface ImagePickerManager ()<UIImagePickerControllerDelegate,UINavigationControllerDelegate,UIActionSheetDelegate>

///来源控制器

@property(nonatomic,strong)UIViewController*orginViewController;

/// 取出的图片

@property (nonatomic,strong) UIImage *tempImage;

@end

@implementationImagePickerManager

- (UIImagePickerController *)imagePicker{

    if (!_imagePicker) {

        _imagePicker = [[UIImagePickerController alloc] init];

        _imagePicker.delegate=self;

        /// 转场动画方式

        //      _imagePicker.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;

        _imagePicker.allowsEditing=YES;//允许编辑

        _imagePicker.videoMaximumDuration = 15 ; //视频时长默认15s

        _imagePicker.videoQuality = UIImagePickerControllerQualityTypeHigh;

    }

    return _imagePicker;

}

- (void)setIsVideo:(BOOL)isVideo{

    _isVideo= isVideo;

    if(isVideo ==YES) {

        /// 媒体类型

        _imagePicker.mediaTypes = @[(NSString *)kUTTypeImage,(NSString *)kUTTypeMovie];

    }else{

        /// 媒体类型

        _imagePicker.mediaTypes = @[(NSString *)kUTTypeImage];

    }

}

- (instancetype)initWithViewController:(UIViewController*)VC{

    self= [superinit];

    if(self) {

        self.orginViewController = VC;

    }

    return self;

}

#pragma mark- 快速创建一个图片选择弹出窗

- (void)quickAlertSheetPickerImage{

    UIActionSheet *sheetView = [[UIActionSheet alloc] initWithTitle:@"选择图片" delegate:self cancelButtonTitle:@"取消" destructiveButtonTitle:nil otherButtonTitles:@"相册",@"拍照", nil];

    [sheetViewshowInView:self.orginViewController.view];

}

#pragma mark-<UIActionSheetDelegate>

- (void)actionSheet:(UIActionSheet*)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {

    NSLog(@"---%ld",buttonIndex);

    if(buttonIndex ==0) {

        ///相册

        [selfopenPhoto];

    }elseif(buttonIndex ==1){

        /// 拍照

        [selfopenCamera];

    }

}

#pragma mark- 打开相机

- (void)openCamera{

    if (![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {

        return;

    }

    self.imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;

    [self.orginViewController presentViewController: self.imagePicker animated:YES completion:^{

        NSLog(@"相机");

    }];

}

#pragma mark- 打开相册

- (void)openPhoto{

    if (![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) {

        return;

    }

    self.imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;

    [self.orginViewController presentViewController: self.imagePicker animated:YES completion:^{

        NSLog(@"相册");

    }];

}

#pragma mark- <UIImagePickerControllerDelegate>

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

    UIImage *orginImage = info[UIImagePickerControllerOriginalImage];

    self.tempImage= [selffixOrientation: orginImage];


    /// 选择的图片

    if(self.didSelectImageBlock){

        self.didSelectImageBlock(self.tempImage);

    }

    ///拍到的照片顺带保存到相册

    if (picker.sourceType == UIImagePickerControllerSourceTypeCamera) {

        [self saveImageToSystemPhotosAlbum];

    }

    [pickerdismissViewControllerAnimated:YES completion:nil];

}

#pragma mark- 拍的照片保存到系统相册

- (void)saveImageToSystemPhotosAlbum{

    UIImageWriteToSavedPhotosAlbum(self.tempImage,self,@selector(image:didFinishSavingWithError:contextInfo:),nil);

}

/// 系统指定的回调方法

- (void)image:(UIImage*)image didFinishSavingWithError:(NSError*)error contextInfo:(void*)contextInfo{

    NSString*msg =nil;

    if(error !=NULL){

        msg =@"保存图片失败";

    }else{

        msg =@"保存图片成功";

    }

    NSLog(@"%@",msg);


}

///矫正图片方向

- (UIImage*)fixOrientation:(UIImage*)aImage

{

    if (aImage.imageOrientation == UIImageOrientationUp)

        returnaImage;


    CGAffineTransform transform = CGAffineTransformIdentity;


    switch (aImage.imageOrientation) {

        case UIImageOrientationDown:

        case UIImageOrientationDownMirrored:

            transform =CGAffineTransformTranslate(transform, aImage.size.width, aImage.size.height);

            transform =CGAffineTransformRotate(transform,M_PI);

            break;

       case UIImageOrientationLeft:

        case UIImageOrientationLeftMirrored:

            transform =CGAffineTransformTranslate(transform, aImage.size.width,0);

            transform =CGAffineTransformRotate(transform,M_PI_2);

            break;

        case UIImageOrientationRight:

        case UIImageOrientationRightMirrored:

            transform =CGAffineTransformTranslate(transform,0, aImage.size.height);

            transform =CGAffineTransformRotate(transform, -M_PI_2);

            break;

        default:

            break;

    }

    switch (aImage.imageOrientation) {

        case UIImageOrientationUpMirrored:

        case UIImageOrientationDownMirrored:

            transform =CGAffineTransformTranslate(transform, aImage.size.width,0);

            transform =CGAffineTransformScale(transform, -1,1);

            break;

        case UIImageOrientationLeftMirrored:

        case UIImageOrientationRightMirrored:

            transform =CGAffineTransformTranslate(transform, aImage.size.height,0);

            transform =CGAffineTransformScale(transform, -1,1);

            break;

        default:

            break;

    }

    CGContextRef ctx = CGBitmapContextCreate(NULL, aImage.size.width, aImage.size.height,

                                             CGImageGetBitsPerComponent(aImage.CGImage),0,

                                             CGImageGetColorSpace(aImage.CGImage),

                                             CGImageGetBitmapInfo(aImage.CGImage));

    CGContextConcatCTM(ctx, transform);

    switch (aImage.imageOrientation) {

        case UIImageOrientationLeft:

        case UIImageOrientationLeftMirrored:

        case UIImageOrientationRight:

        case UIImageOrientationRightMirrored:

            CGContextDrawImage(ctx, CGRectMake(0, 0, aImage.size.height, aImage.size.width), aImage.CGImage);

            break;

        default:

            CGContextDrawImage(ctx, CGRectMake(0, 0, aImage.size.width, aImage.size.height), aImage.CGImage);

            break;

    }

    //创建新的image

    CGImageRef cgimg = CGBitmapContextCreateImage(ctx);

    UIImage* img = [UIImage imageWithCGImage:cgimg];

    CGContextRelease(ctx);

    CGImageRelease(cgimg);

    returnimg;

}

@end

使用:

- (ImagePickerManager *)manager{

    if(!_manager) {

        _manager = [[ImagePickerManager alloc] initWithViewController:self];

    }

    return _manager;

}

- (void)viewDidLoad {

    [super viewDidLoad];

    __weak typeof(self) weakSelf = self;

    [self.manager setDidSelectImageBlock:^(UIImage *img){

        weakSelf.imageView.image= img;

    }];

}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent*)event{

     [self.manager quickAlertSheetPickerImage];

}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,045评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,114评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,120评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,902评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,828评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,132评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,590评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,258评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,408评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,335评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,385评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,068评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,660评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,747评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,967评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,406评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,970评论 2 341

推荐阅读更多精彩内容

  • 今天早上走进了期盼已久的Jim&Jory工作坊,Jim和Jory坐白板旁边,各自身边有一位美女翻译。然后由主办方魏...
    韩会霞阅读 551评论 0 0
  • 血色十二芒星消散过后,我表情始终凝固在羽灵最后站在祭坛上朝我微笑的那刹那,我不知道这算什么,我也不清楚羽灵在我心中...
    考拉凶猛阅读 259评论 0 0
  • 快过年了。 今天,爸爸买了好多拉花要装饰我们的家。我看到一包包拉花,我真的好开心。我让妈妈和我一起拉,妈妈一下...
    孟国强1阅读 288评论 0 2