create objective-c ios xcode photo

objective c - create - iOS tomando fotos programáticamente



create uiimageview programmatically swift 4 (5)

Aquí está el código para la cámara personalizada Objective-C. Puede agregar características, botones de acuerdo a su deseo.

#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

Sé que esto es posible, lo vi en algunas aplicaciones (iGotYa es el más famoso). Sé cómo configurar todo para tomar fotos, guardarlas y todo. ¿Pero cómo se puede hacer programáticamente? simplemente haciendo que el usuario haga clic en algún botón (en el controlador de vista normal) y tomará una foto automáticamente con la cámara frontal y la guardará (o no, solo como una imagen de UII)

¡Gracias!


En archivo .h

@interface ABCViewController : UIViewController @property (strong, nonatomic) IBOutlet UIImageView *imageView; - (IBAction)takePhoto: (UIButton *)sender; - (IBAction)selectPhoto:(UIButton *)sender; @end

En archivo .m

@interface ABCViewController : UIViewController <UIImagePickerControllerDelegate, UINavigationControllerDelegate> - (IBAction)takePhoto:(UIButton *)sender { if (![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) { UIAlertView *myAlertView = [[UIAlertView alloc] initWithTitle:@"Error" message:@"Device has no camera" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil]; [myAlertView show]; } else { UIImagePickerController *picker = [[UIImagePickerController alloc] init]; picker.delegate = self; picker.allowsEditing = YES; picker.sourceType = UIImagePickerControllerSourceTypeCamera; [self presentViewController:picker animated:YES completion:NULL]; } } - (IBAction)selectPhoto:(UIButton *)sender { UIImagePickerController *picker = [[UIImagePickerController alloc] init]; picker.delegate = self; picker.allowsEditing = YES; picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; [self presentViewController:picker animated:YES completion:NULL]; } - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { UIImage *chosenImage = info[UIImagePickerControllerEditedImage]; self.imageView.image = chosenImage; [picker dismissViewControllerAnimated:YES completion:NULL]; } - (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker { [picker dismissViewControllerAnimated:YES completion:NULL]; }


Esto es muy simple, solo use la guía de referencia de AVFoundation :

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

Si no desea que el usuario vea la entrada de la vista previa, solo puede omitir la parte de la capa de vista preliminar establecida del código.

Edición: Para ser más detallado.

1) Usted configura su configuración de captura usando AVFoundation.

  • Ajuste la entrada de la cámara en frontal, apague el flash, etc.

2) PUEDES SALTAR la parte donde se establece la capa de vista previa de video.

3) Llama al método captureStillImageAsynchronouslyFromConnection: completedHandler: siempre que desee que se tome la fotografía.

Nota: Si desea que el flash no se escuche y tal, entonces podría estar violando los derechos de usuario en algunos países (por ejemplo, Japón). Una solución alternativa que conozco para hacerlo es capturar un fotograma de un video (no activa el flash).


También puede hacerlo sin AVFoundation y, en mi opinión, es una forma más sencilla de implementarlo utilizando solo el UIImagePickerController. Hay 3 condiciones:

  1. Obviamente el dispositivo necesita tener una cámara.
  2. Debes ocultar los controles de la cámara.
  3. Luego simplemente use el método takePicture de UIImagePickerController

A continuación se muestra un ejemplo simple que normalmente activaría después de presionar un botón

- (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 es una biblioteca que utiliza AVFoundation para tomar fotos.

Se muestra una vista previa en la vista, que luego puede llamar al método VLBCameraView # takePicture mediante programación para tomar una foto.

Viene con CocoaPods.