iOS 自定义相机

17 篇文章 0 订阅

//

//  MYCameraViewController.m

//  Created by lgy on 2018/11/16.

//  Copyright © 2018年 lgy. All rights reserved.

//

 

#import "MYCameraViewController.h"

#import <AVFoundation/AVFoundation.h>

#import "MainTabBarController.h"

 

@interface MYCameraViewController ()

 

//捕获设备,通常是前置摄像头,后置摄像头,麦克风(音频输入)

@property (nonatomic, strong) AVCaptureDevice *device;

 

//AVCaptureDeviceInput 代表输入设备,他使用AVCaptureDevice 来初始化

@property (nonatomic, strong) AVCaptureDeviceInput *input;

 

//输出图片

@property (nonatomic ,strong) AVCaptureStillImageOutput *imageOutput;

 

//session:由他把输入输出结合在一起,并开始启动捕获设备(摄像头)

@property (nonatomic, strong) AVCaptureSession *session;

 

//图像预览层,实时显示捕获的图像

@property (nonatomic ,strong) AVCaptureVideoPreviewLayer *previewLayer;

 

@property (nonatomic,strong) UIImage *image;

 

//返回按钮

@property (nonatomic, strong) UIButton *backBtn;

@property (nonatomic, strong) UIButton *changeBtn;

@property (nonatomic, strong) UIButton *flashBtn;

@property (nonatomic, strong) UIButton *lightingBtn;

 

@end

 

@implementation MYCameraViewController

 

- (void)viewDidLoad {

    [super viewDidLoad];

    [self cameraDistrict];

    [self layoutStyle];

}

 

-(void) viewWillDisappear:(BOOL)animated{

    [super viewWillDisappear:animated];

    [MainTabBarController selectIndex:1];

}

 

- (void)didReceiveMemoryWarning {

    [super didReceiveMemoryWarning];

    // Dispose of any resources that can be recreated.

}

 

 

#pragma mark --- mySelf

 

- (void)cameraDistrict

{

    //    AVCaptureDevicePositionBack  后置摄像头

    //    AVCaptureDevicePositionFront 前置摄像头

    self.device = [self cameraWithPosition:AVCaptureDevicePositionBack];

    self.input = [[AVCaptureDeviceInput alloc] initWithDevice:self.device error:nil];

    self.imageOutput = [[AVCaptureStillImageOutput alloc] init];

    self.session = [[AVCaptureSession alloc] init];

    //     拿到的图像的大小可以自行设定

    //    AVCaptureSessionPreset320x240

    //    AVCaptureSessionPreset352x288

    //    AVCaptureSessionPreset640x480

    //    AVCaptureSessionPreset960x540

    //    AVCaptureSessionPreset1280x720

    //    AVCaptureSessionPreset1920x1080

    //    AVCaptureSessionPreset3840x2160

    self.session.sessionPreset = AVCaptureSessionPreset640x480;

    //输入输出设备结合

    if ([self.session canAddInput:self.input]) {

        [self.session addInput:self.input];

    }

    if ([self.session canAddOutput:self.imageOutput]) {

        [self.session addOutput:self.imageOutput];

    }

    //预览层的生成

    self.previewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:self.session];

    self.previewLayer.frame = CGRectMake(0, 0, kScreenWidth, kScreenHeight);

    self.previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;

    [self.view.layer addSublayer:self.previewLayer];

    //设备取景开始

    [self.session startRunning];

    if ([_device lockForConfiguration:nil]) {

        //自动闪光灯,

        if ([_device isFlashModeSupported:AVCaptureFlashModeAuto]) {

            [_device setFlashMode:AVCaptureFlashModeAuto];

        }

        //自动白平衡,但是好像一直都进不去

        if ([_device isWhiteBalanceModeSupported:AVCaptureWhiteBalanceModeAutoWhiteBalance]) {

            [_device setWhiteBalanceMode:AVCaptureWhiteBalanceModeAutoWhiteBalance];

        }

        [_device unlockForConfiguration];

    }

    

}

 

- (AVCaptureDevice *)cameraWithPosition:(AVCaptureDevicePosition)position{

    NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];

    for ( AVCaptureDevice *device in devices )

        if ( device.position == position ){

            return device;

        }

    return nil;

}

 

 

//拍照功能

- (void)photoBtnDidClick

{

    AVCaptureConnection *conntion = [self.imageOutput connectionWithMediaType:AVMediaTypeVideo];

    if (!conntion) {

        NSLog(@"拍照失败!");

        return;

    }

    [self.imageOutput captureStillImageAsynchronouslyFromConnection:conntion completionHandler:^(CMSampleBufferRef imageDataSampleBuffer, NSError *error) {

        if (imageDataSampleBuffer == nil) {

            return ;

        }

        NSData *imageData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageDataSampleBuffer];

        self.image = [UIImage imageWithData:imageData];

        [self.session stopRunning];

//        [self.view addSubview:self.cameraImageView];

    }];

    

}

 

#pragma - 保存至相册

- (void)saveImageToPhotoAlbum:(UIImage*)savedImage

{

    UIImageWriteToSavedPhotosAlbum(savedImage, self, @selector(image:didFinishSavingWithError:contextInfo:), NULL);

}

 

// 指定回调方法

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

 

{

    NSString *msg = nil ;

    if(error != NULL){

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

    }else{

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

    }

    [MBProgressHUD showError:msg toView:self.view];

}

 

 

//设置前后相机

- (void)changeCamera{

    NSUInteger cameraCount = [[AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo] count];

    if (cameraCount > 1) {

        NSError *error;

        //给摄像头的切换添加翻转动画

        CATransition *animation = [CATransition animation];

        animation.duration = .5f;

        animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];

        animation.type = @"oglFlip";

        

        AVCaptureDevice *newCamera = nil;

        AVCaptureDeviceInput *newInput = nil;

        //拿到另外一个摄像头位置

        AVCaptureDevicePosition position = [[_input device] position];

        if (position == AVCaptureDevicePositionFront){

            newCamera = [self cameraWithPosition:AVCaptureDevicePositionBack];

            animation.subtype = kCATransitionFromLeft;//动画翻转方向

        }

        else {

            newCamera = [self cameraWithPosition:AVCaptureDevicePositionFront];

            animation.subtype = kCATransitionFromRight;//动画翻转方向

        }

        //生成新的输入

        newInput = [AVCaptureDeviceInput deviceInputWithDevice:newCamera error:nil];

        [self.previewLayer addAnimation:animation forKey:nil];

        if (newInput != nil) {

            [self.session beginConfiguration];

            [self.session removeInput:self.input];

            if ([self.session canAddInput:newInput]) {

                [self.session addInput:newInput];

                self.input = newInput;

                

            } else {

                [self.session addInput:self.input];

            }

            [self.session commitConfiguration];

            

        } else if (error) {

            NSLog(@"toggle carema failed, error = %@", error);

        }

    }

}

 

//AVCaptureFlashMode  闪光灯

//AVCaptureFocusMode  对焦

//AVCaptureExposureMode  曝光

//AVCaptureWhiteBalanceMode  白平衡

//闪光灯和白平衡可以在生成相机时候设置

//曝光要根据对焦点的光线状况而决定,所以和对焦一块写

//point为点击的位置

- (void)focusAtPoint:(CGPoint)point{

    CGSize size = self.view.bounds.size;

    CGPoint focusPoint = CGPointMake( point.y /size.height ,1-point.x/size.width );

    NSError *error;

    if ([self.device lockForConfiguration:&error]) {

        //对焦模式和对焦点

        if ([self.device isFocusModeSupported:AVCaptureFocusModeAutoFocus]) {

            [self.device setFocusPointOfInterest:focusPoint];

            [self.device setFocusMode:AVCaptureFocusModeAutoFocus];

        }

        //曝光模式和曝光点

        if ([self.device isExposureModeSupported:AVCaptureExposureModeAutoExpose ]) {

            [self.device setExposurePointOfInterest:focusPoint];

            [self.device setExposureMode:AVCaptureExposureModeAutoExpose];

        }

        

        [self.device unlockForConfiguration];

        //设置对焦动画

//        _focusView.center = point;

//        _focusView.hidden = NO;

//        [UIView animateWithDuration:0.3 animations:^{

//            _focusView.transform = CGAffineTransformMakeScale(1.25, 1.25);

//        }completion:^(BOOL finished) {

//            [UIView animateWithDuration:0.5 animations:^{

//                _focusView.transform = CGAffineTransformIdentity;

//            } completion:^(BOOL finished) {

//                _focusView.hidden = YES;

//            }];

//        }];

    }

    

}

 

 

-(void) layoutStyle{

    [self.view addSubview:self.backBtn];

    [self.backBtn mas_makeConstraints:^(MASConstraintMaker *make) {

        make.top.mas_equalTo(30);

        make.left.mas_equalTo(20);

        make.size.mas_equalTo(CGSizeMake(40, 30));

    }];

}

 

#pragma mark -- get

 

-(UIButton *) backBtn{

    if(!_backBtn){

        _backBtn = [[UIButton alloc] init];

        [_backBtn setTitle:@"返回" forState:UIControlStateNormal];

        [_backBtn addTarget:self action:@selector(backAction) forControlEvents:UIControlEventTouchUpInside];

    }

    return _backBtn;

}

 

-(UIButton *) changeBtn{

    if(!_changeBtn){

        _changeBtn = [[UIButton alloc] init];

    }

    return _changeBtn;

}

 

-(UIButton *) flashBtn{

    if(!_flashBtn){

        _flashBtn = [[UIButton alloc] init];

    }

    return _flashBtn;

}

 

-(UIButton *) lightingBtn{

    if(!_lightingBtn){

        _lightingBtn = [[UIButton alloc] init];

    }

    return _lightingBtn;

}

 

 

@end

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值