iOS自定义相机Demo

//  Created by David_Tian on 14-9-24.
//  Copyright (c) 2014年 All rights reserved.
//  未做适配,有兴趣的童鞋可以扩展

#import "cameraViewController.h"
#import <AVFoundation/AVFoundation.h>
#import <ImageIO/ImageIO.h>
#import <QuartzCore/QuartzCore.h>

typedef enum{
    isFrontCamera = 0,
    isBackCamera
} cameraType;

typedef enum{
    AutoFlash = 0,
    CloseFlash,
    OpenFlash
} flashModel;

@interface cameraViewController ()
< AVCaptureAudioDataOutputSampleBufferDelegate, UIImagePickerControllerDelegate >
{
    UIImage *_photo;
    BOOL _isFontCamera;
}

@property (strong, nonatomic) AVCaptureSession           *session;       // 捕获会话
@property (nonatomic, strong) AVCaptureStillImageOutput  *captureOutput; // 输出设备
@property (nonatomic, strong) AVCaptureVideoPreviewLayer *previewLayer;  // 取景器 

@end

@implementation cameraViewController

- (AVCaptureSession *)session
{
    if (_session == nil) {
        _session = [[AVCaptureSession alloc] init];
    }
    return _session;
}
- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor grayColor];
UIButton
*btnCam = [[UIButton alloc]initWithFrame:CGRectMake(20, 44, 80, 30)]; [btnCam setTitle:@"拍照" forState:UIControlStateNormal]; [btnCam setTitle:@"重照" forState:UIControlStateSelected];//重拍没做 [btnCam setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; [btnCam addTarget:self action:@selector(capture) forControlEvents:UIControlEventTouchUpInside]; [btnCam setBackgroundColor:[UIColor whiteColor]]; [self.view addSubview:btnCam]; UIButton *btnSelectCam = [[UIButton alloc]initWithFrame:CGRectMake(110, 44, 80, 30)]; [btnSelectCam setTitle:@"后置相机" forState:UIControlStateNormal]; [btnSelectCam setTitle:@"前置相机" forState:UIControlStateSelected]; [btnSelectCam setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; [btnSelectCam addTarget:self action:@selector(switchCamera:) forControlEvents:UIControlEventTouchUpInside]; [btnSelectCam setBackgroundColor:[UIColor whiteColor]]; [self.view addSubview:btnSelectCam]; UIButton *btnFlash = [[UIButton alloc]initWithFrame:CGRectMake(200, 44, 80, 30)]; [btnFlash setTitle:@"闪光灯" forState:UIControlStateNormal]; [btnFlash setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; [btnFlash addTarget:self action:@selector(switchFlashMode:) forControlEvents:UIControlEventTouchUpInside]; [btnFlash setBackgroundColor:[UIColor whiteColor]]; [self.view addSubview:btnFlash]; [self switchCamera:nil]; }
#pragma mark - action // 拍照 - (void)capture { if (![self.session isRunning]) { [self getPhoto]; }else{ [_session stopRunning]; } } // 切换摄像头 - (void)switchCamera:(UIButton *)sender { [self.session stopRunning]; [_previewLayer removeFromSuperlayer]; sender.selected = !sender.selected; _isFontCamera = !_isFontCamera; [self setupCamera]; } // 获取图片 - (void)getPhoto { AVCaptureConnection *videoConnection = nil; for (AVCaptureConnection *connection in _captureOutput.connections) { for (AVCaptureInputPort *port in [connection inputPorts]) { if ([[port mediaType] isEqual:AVMediaTypeVideo] ) { videoConnection = connection; break; } } if (videoConnection) { break; } } [_captureOutput captureStillImageAsynchronouslyFromConnection:videoConnection completionHandler:^(CMSampleBufferRef imageSampleBuffer, NSError *error) { CFDictionaryRef exifAttachments = CMGetAttachment(imageSampleBuffer, kCGImagePropertyExifDictionary, nil); if (exifAttachments) { // Do something with the attachments. } // 获取图片数据 NSData *imageData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageSampleBuffer]; UIImage *t_image = [[UIImage alloc] initWithData:imageData]; _photo = [[UIImage alloc]initWithCGImage:t_image.CGImage scale:1.5 orientation:UIImageOrientationRight]; UIImageView *imageView = [[UIImageView alloc]initWithFrame:_previewLayer.frame]; [_previewLayer removeFromSuperlayer]; imageView.image = _photo; imageView.contentMode = UIViewContentModeScaleAspectFill; imageView.clipsToBounds = YES; [self.view addSubview:imageView]; }]; } // 切换闪光灯模式 - (void)switchFlashMode:(UIButton*)sender { Class captureDeviceClass = NSClassFromString(@"AVCaptureDevice"); if (!captureDeviceClass) { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示信息" message:@"您的设备没有拍照功能" delegate:nil cancelButtonTitle:NSLocalizedString(@"Sure", nil) otherButtonTitles: nil]; [alert show]; return; } NSString *imgName = @""; AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; [device lockForConfiguration:nil]; if ([device hasFlash]) { if (device.flashMode == AVCaptureFlashModeOff) { device.flashMode = AVCaptureFlashModeOn; imgName = @""; } else if (device.flashMode == AVCaptureFlashModeOn) { device.flashMode = AVCaptureFlashModeAuto; imgName = @""; } else if (device.flashMode == AVCaptureFlashModeAuto) { device.flashMode = AVCaptureFlashModeOff; imgName = @""; } if (sender) { [sender setImage:[UIImage imageNamed:imgName] forState:UIControlStateNormal]; } } else { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示信息" message:@"您的设备没有闪光灯功能" delegate:nil cancelButtonTitle:@"ok" otherButtonTitles: nil]; [alert show]; } [device unlockForConfiguration]; } // 初始化相机 - (void)setupCamera { AVCaptureDevice *captureDevice = [self getVideoInputCamera:(_isFontCamera ? isFrontCamera : isBackCamera)]; AVCaptureDeviceInput *deviceInput = [AVCaptureDeviceInput deviceInputWithDevice:captureDevice error:nil]; if ([self.session canAddInput:deviceInput]){ [_session addInput:deviceInput]; } // 预览视图(取景器) _previewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:self.session]; [_previewLayer setVideoGravity:AVLayerVideoGravityResizeAspectFill]; CALayer *preLayer = [[self view] layer]; [preLayer setMasksToBounds:YES]; [_previewLayer setFrame:CGRectMake(10, 100, 300, 300)]; [preLayer insertSublayer:_previewLayer atIndex:0]; [_session startRunning]; // 创建一个输出设备,并将它添加到会话 _captureOutput = [[AVCaptureStillImageOutput alloc] init]; NSDictionary *outputSettings = [[NSDictionary alloc] initWithObjectsAndKeys:AVVideoCodecJPEG,AVVideoCodecKey,nil]; _captureOutput.outputSettings = outputSettings; [_session addOutput:_captureOutput]; } #pragma mark VideoCapture - (AVCaptureDevice *)getVideoInputCamera:(cameraType )cameraType { //获取(后置/前置)摄像头设备 NSArray *cameras = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo]; for (AVCaptureDevice *device in cameras){ switch (cameraType) { case isFrontCamera: if (device.position == AVCaptureDevicePositionFront) return device; break; case isBackCamera: if (device.position == AVCaptureDevicePositionBack) return device; break; default: break; } } return [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; } @end

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。