私はこれが可能であることを知っています、いくつかのアプリでこれを見ました(iGotYaは私が最も有名だと信じています)。写真を撮って保存するためのすべてを設定する方法を知っています。しかし、プログラムでどのように行うことができますか? (通常のView Controllerの)ボタンをクリックするだけで、フロントカメラを使用して自動的に写真を撮って保存します(またはUIImageとして取得しないでください)
ありがとう!
これは非常に簡単です。AVFoundationリファレンスガイドを使用してください。
ユーザーにプレビュー入力を表示したくない場合は、コードのプレビューレイヤーの設定部分をスキップできます。
編集:より詳細に。
1)AVFoundationを使用してキャプチャ設定を設定します。
2)ビデオプレビューレイヤーが設定されている部分をスキップします。
3)写真を撮りたいときはいつでもcaptureStillImageAsynchronouslyFromConnection:completionHandler:メソッドを呼び出します。
注:フラッシュを聞きたくない場合など、一部の国(日本など)でユーザー権利に違反している可能性があります。私が知っている回避策の1つは、ビデオのフレームをキャプチャすることです(フラッシュをトリガーしません)。
AVFoundationを使用せずに実行することもできますが、UIImagePickerControllerのみを使用して実装する方が簡単だと思います。 3つの条件があります。
以下は、通常、ボタンを押した後にトリガーする単純な例です
- (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];
}];
}
VLBCameraView は、AVFoundationを使用して写真を撮るライブラリです。
ビューにプレビューが表示されます。このプレビューをプログラムでメソッドVLBCameraView#takePictureを呼び出して写真を撮ることができます。
CocoaPodsが付属しています。
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