2015-09-04 5 views
2

J'ai créé un appareil photo personnalisé, le problème avec c'est quand je prends la photo il sort dans un rapport différent puis quand j'ai pris la photo.ios - Comment faire de l'image d'entrée de la caméra le même rapport que l'image de sortie?

Exemple:

Avant:

enter image description here

Après:

enter image description here

avis que l'image a été presque écrasé sur le côté. Je veux réparer ça. Je veux que le résultat final soit exactement le même que l'image d'entrée. J'ai créé une vue de la taille de l'écran et l'ai utilisée pour faire le cadre de l'appareil photo, puis j'ai créé une vue d'image de la même taille qui couvre l'écran, pour une raison quelconque, les photos sont différentes .

Ci-dessous mon code source utilisé pour ma classe de la caméra:

#import "CameraViewController.h" 
#import <AVFoundation/AVFoundation.h> 

@interface CameraViewController() 

@end 

@implementation CameraViewController { 
    BOOL isFront; 
} 
AVCaptureSession *session; 
AVCaptureStillImageOutput *imageOutput; 

@synthesize cancelButton; 

-(BOOL)prefersStatusBarHidden { 
    return YES; 
} 

-(void)viewDidAppear:(BOOL)animated { 
    isFront = NO; 
    session = [[AVCaptureSession alloc]init]; 
    [session setSessionPreset:AVCaptureSessionPresetPhoto]; 

    AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; 
    NSError *error; 
    AVCaptureDeviceInput *deviceInput = [AVCaptureDeviceInput deviceInputWithDevice:device error:&error]; 

    if ([session canAddInput:deviceInput]) { 
     [session addInput:deviceInput]; 
    } 

    AVCaptureVideoPreviewLayer *previewLayer = [[AVCaptureVideoPreviewLayer alloc]initWithSession:session]; 
    [previewLayer setVideoGravity:AVLayerVideoGravityResizeAspectFill]; 
    CALayer *rootLayer = [[self view]layer]; 
    [rootLayer setMasksToBounds:YES]; 
    CGRect frame = self.captureFrame.frame; 

    [previewLayer setFrame:frame]; 

    [rootLayer insertSublayer:previewLayer atIndex:0]; 

    imageOutput = [[AVCaptureStillImageOutput alloc]init]; 

    NSDictionary *outputSettings = [[NSDictionary alloc]initWithObjectsAndKeys:AVVideoCodecJPEG, AVVideoCodecKey, nil]; 
    [imageOutput setOutputSettings:outputSettings]; 

    [session addOutput:imageOutput]; 

    [session startRunning]; 



} 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view. 
    cancelButton.hidden = YES; 
} 

- (IBAction)capture:(id)sender { 
    AVCaptureConnection *videoConnection = nil; 

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

    [imageOutput captureStillImageAsynchronouslyFromConnection:videoConnection completionHandler:^(CMSampleBufferRef imageDataSampleBuffer, NSError *error) { 
     if (imageDataSampleBuffer != NULL) { 

      NSData *imageData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageDataSampleBuffer]; 
      UIImage *image = [UIImage imageWithData:imageData]; 

      // Need to rescale image 
      if (isFront == NO) { 
       self.imageView.image = image; 
       cancelButton.hidden = NO; 
      }else if (isFront == YES) 

      //Need to flip image here 

      self.imageView.image = image; 
      cancelButton.hidden = NO; 
     } 
    }]; 

} 


// Delete photo just taking 
- (IBAction)cancelAction:(id)sender { 
    cancelButton.hidden = YES; 
    self.imageView.image = nil; 
} 

// Dismiss this viewcontroller 
-(IBAction)backButton:(id)sender{ 
    [[NSNotificationCenter defaultCenter] postNotificationName:@"DISMISSCAMERA"object:nil]; 

} 

// Switch Camera 
- (IBAction)switchCamera:(id)sender { 
    if(session) 
    { 

     if (isFront == NO) { 
      isFront = YES; 
     }else if (isFront == YES) { 
      isFront = NO; 
     } 

     //Indicate that some changes will be made to the session 
     [session beginConfiguration]; 

     //Remove existing input 
     AVCaptureInput* currentCameraInput = [session.inputs objectAtIndex:0]; 
     [session removeInput:currentCameraInput]; 

     //Get new input 
     AVCaptureDevice *newCamera = nil; 
     if(((AVCaptureDeviceInput*)currentCameraInput).device.position == AVCaptureDevicePositionBack) 
     { 
      newCamera = [self cameraWithPosition:AVCaptureDevicePositionFront]; 
     } 
     else 
     { 
      newCamera = [self cameraWithPosition:AVCaptureDevicePositionBack]; 
     } 

     //Add input to session 
     NSError *err = nil; 
     AVCaptureDeviceInput *newVideoInput = [[AVCaptureDeviceInput alloc] initWithDevice:newCamera error:&err]; 
     if(!newVideoInput || err) 
     { 
      NSLog(@"Error creating capture device input: %@", err.localizedDescription); 
     } 
     else 
     { 
      [session addInput:newVideoInput]; 
     } 

     //Commit all the configuration changes at once 
     [session commitConfiguration]; 
    } 
} 
// Find a camera with the specified AVCaptureDevicePosition, returning nil if one is not found 
- (AVCaptureDevice *) cameraWithPosition:(AVCaptureDevicePosition) position 
{ 
    NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo]; 
    for (AVCaptureDevice *device in devices) 
    { 
     if ([device position] == position) return device; 
    } 
    return nil; 
} 

@end 

Répondre

1

Transforme c'était le problème:

[previewLayer setVideoGravity:AVLayerVideoGravityResizeAspectFill]; 

Je l'ai mis à cette place:

[previewLayer setVideoGravity:AVLayerVideoGravityResize]; 

Fonctionne comme un charme.

+0

Presque, vous avez encore une certaine déformation –