web-dev-qa-db-ja.com

プログラムで写真を撮るiOS

私はこれが可能であることを知っています、いくつかのアプリでこれを見ました(iGotYaは私が最も有名だと信じています)。写真を撮って保存するためのすべてを設定する方法を知っています。しかし、プログラムでどのように行うことができますか? (通常のView Controllerの)ボタンをクリックするだけで、フロントカメラを使用して自動的に写真を撮って保存します(またはUIImageとして取得しないでください)

ありがとう!

28
La bla bla

これは非常に簡単です。AVFoundationリファレンスガイドを使用してください。

https://developer.Apple.com/library/ios/#documentation/AudioVideo/Conceptual/AVFoundationPG/Articles/04_MediaCapture.html

ユーザーにプレビュー入力を表示したくない場合は、コードのプレビューレイヤーの設定部分をスキップできます。

編集:より詳細に。

1)AVFoundationを使用してキャプチャ設定を設定します。

  • カメラ入力を正面に設定し、フラッシュをオフにするなど。

2)ビデオプレビューレイヤーが設定されている部分をスキップします。

3)写真を撮りたいときはいつでもcaptureStillImageAsynchronouslyFromConnection:completionHandler:メソッドを呼び出します。

注:フラッシュを聞きたくない場合など、一部の国(日本など)でユーザー権利に違反している可能性があります。私が知っている回避策の1つは、ビデオのフレームをキャプチャすることです(フラッシュをトリガーしません)。

23
Pochi

AVFoundationを使用せずに実行することもできますが、UIImagePickerControllerのみを使用して実装する方が簡単だと思います。 3つの条件があります。

  1. 明らかにデバイスにはカメラが必要です
  2. カメラコントロールを非表示にする必要があります
  3. 次に、UIImagePickerControllerのtakePictureメソッドを使用します

以下は、通常、ボタンを押した後にトリガーする単純な例です

- (IBAction)takePhoto:(id)sender 
{
    UIImagePickerController *picker = [[UIImagePickerController alloc] init];
    picker.delegate = self;
    picker.sourceType = UIImagePickerControllerSourceTypeCamera;
    picker.cameraDevice = UIImagePickerControllerCameraDeviceFront;
    picker.showsCameraControls = NO;
    [self presentViewController:picker animated:YES
                     completion:^ {
                         [picker takePicture];
                     }];
}
15
GrandSteph

VLBCameraView は、AVFoundationを使用して写真を撮るライブラリです。

ビューにプレビューが表示されます。このプレビューをプログラムでメソッドVLBCameraView#takePictureを呼び出して写真を撮ることができます。

CocoaPodsが付属しています。

2
samwize

Objective -Cカスタムカメラのコードは次のとおりです。希望に応じて機能やボタンを追加できます。

#import "CustomCameraVC.h"

@interface CustomCameraVC ()  {
    BOOL frontCamera;
}
@property (strong,nonatomic) AVCaptureSession *captureSession;
@property (strong,nonatomic) AVCaptureStillImageOutput *stillImageOutput;
@property (strong,nonatomic) AVCaptureVideoPreviewLayer *videoPreviewLayer;
@property (weak, nonatomic) IBOutlet UIView *viewCamera;


@end

@implementation CustomCameraVC

- (void)viewDidLoad {
    [super viewDidLoad];        
}

-(void)viewWillAppear:(BOOL)animated  {
    [super viewWillAppear:YES];
    frontCamera = NO;
    [self showCameraWithFrontCamera:frontCamera];

}

-(void)showCameraWithFrontCamera:(BOOL)flag {
    self.captureSession = [[AVCaptureSession alloc]init];
    self.captureSession.sessionPreset = AVCaptureSessionPresetPhoto;
    AVCaptureDevice *captureDevice;
    if(flag)  {
      captureDevice= [self frontCamera];
    }
    else {
      captureDevice= [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
    }
    NSError *error = nil;
    AVCaptureDeviceInput *input =   [AVCaptureDeviceInput deviceInputWithDevice:captureDevice error:&error];

    [self.captureSession addInput:input];
    self.stillImageOutput = [AVCaptureStillImageOutput new];
    self.stillImageOutput.outputSettings = @{AVVideoCodecKey:AVVideoCodecJPEG};
    [self.captureSession addOutput:_stillImageOutput];
    self.videoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:self.captureSession];

    self.videoPreviewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
    self.videoPreviewLayer.connection.videoOrientation = AVCaptureVideoOrientationPortrait;
    [self.viewCamera.layer addSublayer:self.videoPreviewLayer];
    [self.captureSession startRunning];
    self.videoPreviewLayer.frame = self.viewCamera.bounds;
}


- (AVCaptureDevice *)frontCamera {
    NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];
    for (AVCaptureDevice *device in devices) {
        if ([device position] == AVCaptureDevicePositionFront) {
            return device;
        }
    }
    return nil;
}


- (IBAction)btnCaptureImagePressed:(id)sender {

     AVCaptureConnection * videoConnection =  [_stillImageOutput connectionWithMediaType:AVMediaTypeVideo];

    [_stillImageOutput captureStillImageAsynchronouslyFromConnection:videoConnection completionHandler:^(CMSampleBufferRef  _Nullable sampleBuffer, NSError * _Nullable error) {
       NSData *imageData =  [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:sampleBuffer];
        UIImage *image = [[UIImage alloc]initWithData: imageData];
        UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil);
    }];

}

@end
0
varender singh