在后台捕捉图像?

时间:2013-09-11 08:26:29

标签: ios objective-c camera

我正在尝试从相机捕捉背景中的图像而不加载相机或预览界面。

在我的应用程序中,照片是在后台拍摄的,没有预览屏幕,只是普通的应用程序屏幕,然后显示给用户。

有人可以指出我正确的方向吗?

2 个答案:

答案 0 :(得分:2)

你必须使用AVCaptureSession& AVCaptureDeviceInput。

这部分代码可以帮助您:

@interface MyViewController : UIViewController
{
    AVCaptureStillImageOutput *_output;
    AVCaptureConnection *_videoConnection;
    bool _isCaptureSessionStarted;
}

@property (retain, nonatomic) AVCaptureDevice *frontalCamera;

- (void)takePhoto;

实现:

@interface MyViewController ()

@end

@implementation MyViewController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        _isCaptureSessionStarted = false;
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    // Finding frontal camera
    NSArray *cameras = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];

    for (int i = 0; i < cameras.count; i++) {
        AVCaptureDevice *camera = [cameras objectAtIndex:i];

        if (camera.position == AVCaptureDevicePositionFront) {
            self.frontalCamera = camera;

            [self.frontalCamera addObserver:self forKeyPath:@"adjustingExposure" options:NSKeyValueObservingOptionNew context:nil];
            [self.frontalCamera addObserver:self forKeyPath:@"adjustingWhiteBalance" options:NSKeyValueObservingOptionNew context:nil];
        }
    }
}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    if (!self.frontalCamera.adjustingExposure && !self.frontalCamera.adjustingWhiteBalance) {
        if (_isCaptureSessionStarted) {
            [self captureStillImage];
        }
    }
}

- (void)takePhoto
{
    if (self.frontalCamera != nil) {
        // Add camera to session
        AVCaptureSession *session = [[AVCaptureSession alloc] init];

        NSError *error;
        AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:self.frontalCamera error:&error];

        if (!error && [session canAddInput:input]) {
            [session addInput:input];

            // Capture still image
            _output = [[AVCaptureStillImageOutput alloc] init];

            // Captured image settings
            [_output setOutputSettings:[[NSDictionary alloc] initWithObjectsAndKeys:AVVideoCodecJPEG, AVVideoCodecKey, nil]];

            if ([session canAddOutput:_output]) {
                [session addOutput:_output];

                _videoConnection = nil;

                for (AVCaptureConnection *connection in _output.connections) {
                    for (AVCaptureInputPort *port in [connection inputPorts]) {
                        if ([[port mediaType] isEqual:AVMediaTypeVideo]) {
                            _videoConnection = connection;
                            break;
                        }
                    }
                    if (_videoConnection) {
                        break;
                    }
                }

                if (_videoConnection) {
                    [session startRunning];
                    NSLock *lock = [[[NSLock alloc] init] autorelease];
                    [lock lock];
                    _isCaptureSessionStarted = true;
                    [lock unlock];
                }
            }
        } else {
            NSLog(@"%@",[error localizedDescription]);
        }
    }
}

- (void) captureStillImage
{
    [_output captureStillImageAsynchronouslyFromConnection:_videoConnection completionHandler:^(CMSampleBufferRef imageDataSampleBuffer, NSError *error) {

        NSLock *lock = [[[NSLock alloc] init] autorelease];
        [lock lock];
        _isCaptureSessionStarted = false;
        [lock unlock];

        if (imageDataSampleBuffer != NULL) {
            NSData *bitmap = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageDataSampleBuffer];

//            You can get image here via [[UIImage alloc] initWithData:bitmap]
        }
    }];
}

答案 1 :(得分:0)

在一个手机上的(游戏)应用程序中。例如android手机; 是..您同时按下相机按钮和正面电源按钮..音量增大和/或减小按钮与正面电源按钮或音量增大/减小侧面电源按钮吗?要捕获应用程序(app)的图像以获得额外的积分?通过该游戏竞赛规则。