2014-08-30 1 views
2

Привет, я использую avcapturesession в xcode, чтобы сделать экран с живой камерой, чтобы я мог делать фотографии (похожие на настройки snapchat). Камера полностью работоспособна, и я ее настроил, поэтому я могу использовать переднюю или заднюю камеру. Задняя камера работает отлично, и я могу захватить изображение, и он просматривает, как мне это нужно, однако передняя камера просматривает нормально, но когда изображение захвачено, в предварительном просмотре оно перевернуто, и я не вижу, где это происходит.Captured image flipped horizontally

Heres мой код для сессии:

- (void) initializeCamera { 
AVCaptureSession *session = [[AVCaptureSession alloc] init]; 
session.sessionPreset = AVCaptureSessionPresetHigh; 

AVCaptureVideoPreviewLayer *captureVideoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session]; 
[captureVideoPreviewLayer setVideoGravity:AVLayerVideoGravityResizeAspectFill]; 

captureVideoPreviewLayer.frame = self.imagePreview.bounds; 
[self.imagePreview.layer addSublayer:captureVideoPreviewLayer]; 

UIView *view = [self imagePreview]; 
CALayer *viewLayer = [view layer]; 
[viewLayer setMasksToBounds:YES]; 

CGRect bounds = [view bounds]; 
[captureVideoPreviewLayer setFrame:bounds]; 

NSArray *devices = [AVCaptureDevice devices]; 
AVCaptureDevice *frontCamera = nil; 
AVCaptureDevice *backCamera = nil; 

for (AVCaptureDevice *device in devices) { 

    NSLog(@"Device name: %@", [device localizedName]); 

    if ([device hasMediaType:AVMediaTypeVideo]) { 

     if ([device position] == AVCaptureDevicePositionBack) { 
      NSLog(@"Device position : back"); 
      backCamera = device; 
     } 
     else { 
      NSLog(@"Device position : front"); 
      frontCamera = device; 
     } 
    } 
} 

if (!FrontCamera) { 
    NSError *error = nil; 
    AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:backCamera error:&error]; 
    if (!input) { 
     NSLog(@"ERROR: trying to open camera: %@", error); 
    } 
    [session addInput:input]; 
} 

if (FrontCamera) { 
    NSError *error = nil; 
    AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:frontCamera error:&error]; 
    if (!input) { 
     NSLog(@"ERROR: trying to open camera: %@", error); 
    } 
    [session addInput:input]; 

} 

stillImageOutput = [[AVCaptureStillImageOutput alloc] init]; 
NSDictionary *outputSettings = [[NSDictionary alloc] initWithObjectsAndKeys: AVVideoCodecJPEG, AVVideoCodecKey, nil]; 
[stillImageOutput setOutputSettings:outputSettings]; 

[session addOutput:stillImageOutput]; 

[session startRunning]; 
} 
- (void) capImage { 
AVCaptureConnection *videoConnection = nil; 
for (AVCaptureConnection *connection in stillImageOutput.connections) { 

    for (AVCaptureInputPort *port in [connection inputPorts]) { 

     if ([[port mediaType] isEqual:AVMediaTypeVideo]) { 
      videoConnection = connection; 
      break; 
     } 
    } 

    if (videoConnection) { 
     break; 
    } 
} 

NSLog(@"about to request a capture from: %@", stillImageOutput); 
[stillImageOutput captureStillImageAsynchronouslyFromConnection:videoConnection completionHandler: ^(CMSampleBufferRef imageSampleBuffer, NSError *error) { 

    if (imageSampleBuffer != NULL) { 
     NSData *imageData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageSampleBuffer]; 
     [self processImage:[UIImage imageWithData:imageData]]; 
    } 
}]; 
} 

- (void) processImage:(UIImage *)image { 
haveImage = YES; 

if([UIDevice currentDevice].userInterfaceIdiom==UIUserInterfaceIdiomPad) { //Device is ipad 
    UIGraphicsBeginImageContext(CGSizeMake(3072, 4088)); 
    [image drawInRect: CGRectMake(0, 0, 3072, 4088)]; 
    UIImage *smallImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    CGRect cropRect = CGRectMake(0, 0, 3072, 4088); 
    CGImageRef imageRef = CGImageCreateWithImageInRect([smallImage CGImage], cropRect); 

    [captureImage setImage:[UIImage imageWithCGImage:imageRef]]; 

    CGImageRelease(imageRef); 

}else{ //Device is iphone 
    UIGraphicsBeginImageContext(CGSizeMake(1280, 2272)); 
    [image drawInRect: CGRectMake(0, 0, 1280, 2272)]; 
    UIImage *smallImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    UIImage * flippedImage = [UIImage imageWithCGImage:smallImage.CGImage scale:smallImage.scale orientation:UIImageOrientationLeftMirrored]; 

    smallImage = flippedImage; 

    CGRect cropRect = CGRectMake(0, 0, 1280, 2272); 
    CGImageRef imageRef = CGImageCreateWithImageInRect([smallImage CGImage], cropRect); 


    [captureImage setImage:[UIImage imageWithCGImage:imageRef]]; 

    CGImageRelease(imageRef); 
} 
} 

Я также хочу, чтобы добавить контакт, чтобы сосредоточиться и вспышка, но я не знаю, где я должен реализовать код здесь является то, что я нашел:

flash-

для вспышки все, что я могу найти относительно факела, является переключателем. Я не могу найти способ заставить его работать и работать, как приложения для приложений для яблок.

нажмите, чтобы сосредоточиться -

ios AVFoundation tap to focus

+0

Истина - это поведение по умолчанию для фронтальных камер. Сделайте снимок с передней камеры и посмотрите, как отображается ваш телефон. Случается и на телефонах Android. Передняя камера имитирует зеркало, так что вы можете использовать его естественным образом, следовательно, выходное изображение перевернуто. –

ответ

2

Я считаю, что это поведение по умолчанию для фронтальной камеры. Попробуйте щелкнуть выходное изображение вручную прямо перед его отображением.

+0

Хорошо, но когда я изменяю переворачиваемую вещь в Образе процесса: UIImage * flippedImage = [UIImage imageWithCGImage: smallImage.CGImage scale: smallImage.scale orientation: UIImageOrientationLeftMirrored]; UIImageOrientationLeftMirrored ничего не делает с результатами, и я только хочу, чтобы он перевернул фронтальную камеру. – Tavis

+0

Извините, я не могу вам помочь. Однако вы можете попытаться найти один из многих репозиториев камеры на github и погрузиться в свой код, чтобы увидеть, как они это делают. Есть несколько, которые решили эту точную проблему. –

+0

хорошо, я не могу найти его, может быть, вы можете предоставить ссылку – Tavis