2012-03-29 63 views
3

在这里需要帮助,已经解决了几个小时,但无济于事。如何在横向模式而不是纵向模式下捕获avfoundation

我想在AVCaptureVideoPreviewLayer中捕捉图像并显示它的预览,它以横向模式显示。但是,当我抓住图像时,它被显示为肖像模式。

我不知道为什么,我希望有人可以帮助我:)

感谢您的阅读。

当实时取景 enter image description here

捕获并中的UIImageView所示 enter image description here

- (void)addStillImageOutput 
{ 
    [self setStillImageOutput:[[AVCaptureStillImageOutput alloc] init]]; 
    NSDictionary *outputSettings = [[NSDictionary alloc] initWithObjectsAndKeys:AVVideoCodecJPEG,AVVideoCodecKey,nil]; 
    [[self stillImageOutput] setOutputSettings:outputSettings]; 

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

    [[self captureSession] addOutput:[self stillImageOutput]]; 
} 

    - (void)captureStillImage 
{ 
    AVCaptureConnection *videoConnection = nil; 
    for (AVCaptureConnection *connection in [[self stillImageOutput] connections]) { 
     for (AVCaptureInputPort *port in [connection inputPorts]) { 
      if ([[port mediaType] isEqual:AVMediaTypeVideo]) { 
       videoConnection = connection; 
       break; 
      } 
     } 

     if([videoConnection isVideoOrientationSupported]) 
     { 
      UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation; 

      if (orientation == UIInterfaceOrientationLandscapeLeft) { 
       //NSLog(@"2222UIInterfaceOrientationLandscapeLeft"); 

      [videoConnection setVideoOrientation:AVCaptureVideoOrientationLandscapeLeft]; 
      } 
      if (orientation == UIInterfaceOrientationLandscapeRight) 
      {//NSLog(@"222UIInterfaceOrientationLandscapeRight"); 

      [videoConnection setVideoOrientation:AVCaptureVideoOrientationLandscapeRight]; 
      } 

     } 
     if (videoConnection) { 
      break; 
     } 
    } 

    //NSLog(@"about to request a capture from: %@", [self stillImageOutput]); 
    [[self stillImageOutput] captureStillImageAsynchronouslyFromConnection:videoConnection 

                 completionHandler:^(CMSampleBufferRef imageSampleBuffer, NSError *error) { 
       CFDictionaryRef exifAttachments = CMGetAttachment(imageSampleBuffer, kCGImagePropertyExifDictionary, NULL); 

      if (exifAttachments) { 
       ////NSLog(@"attachements: %@", exifAttachments); 
       } 
      else 
      { 
         //NSLog(@"no attachments"); 

      } 

     NSData *imageData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageSampleBuffer]; 
     UIImage *image = [[UIImage alloc] initWithData:imageData]; 

     //NSData *jpgImageData = UIImageJPEGRepresentation(image, 0.9); 
     //UIImage *jpgImage = [[UIImage alloc]initWithData:jpgImageData]; 
     [self setStillImage:image]; 
     self.imageExifDict = (__bridge NSDictionary *)exifAttachments; 
       ////NSLog(@"NSdictionary from CFDict %@",self.imageExifDict); 
// 
     [[NSNotificationCenter defaultCenter] postNotificationName:kImageCapturedSuccessfully object:nil]; 

      }]; 
} 

我通过从NSData的图像以UIImage的

self.capturedImage.image = [[self captureManager] stillImage]; 
+0

你可以发表一些代码,请你如何'AVCaptureVideoPreviewLayer,它显示在横向模式。我有同样的问题。 – user2545330 2013-08-21 07:04:44

+0

@ user2545330编辑我的帖子。我希望它有帮助! – Desmond 2013-08-22 01:52:53

回答

3

我没有使用本C功能时:

UIImage *scaleAndRotateImage(UIImage *image) 
{ 
int kMaxResolution = 2048; // Or whatever 

CGImageRef imgRef = image.CGImage; 

CGFloat width = CGImageGetWidth(imgRef); 
CGFloat height = CGImageGetHeight(imgRef); 

CGAffineTransform transform = CGAffineTransformIdentity; 
CGRect bounds = CGRectMake(0, 0, width, height); 
if (width > kMaxResolution || height > kMaxResolution) { 
    CGFloat ratio = width/height; 

    if (ratio > 1) { 
     bounds.size.width = kMaxResolution; 
     bounds.size.height = bounds.size.width/ratio; 
    } 
    else { 
     bounds.size.height = kMaxResolution; 
     bounds.size.width = bounds.size.height * ratio; 
    } 
} 

CGFloat scaleRatio = bounds.size.width/width; 
CGSize imageSize = CGSizeMake(CGImageGetWidth(imgRef), CGImageGetHeight(imgRef)); 
CGFloat boundHeight; 
UIImageOrientation orient = image.imageOrientation; 
switch(orient) { 

    case UIImageOrientationUp: //EXIF = 1 
     transform = CGAffineTransformIdentity; 
     break; 

    case UIImageOrientationUpMirrored: //EXIF = 2 
     transform = CGAffineTransformMakeTranslation(imageSize.width, 0.0); 
     transform = CGAffineTransformScale(transform, -1.0, 1.0); 
     break; 

    case UIImageOrientationDown: //EXIF = 3 
     transform = CGAffineTransformMakeTranslation(imageSize.width, imageSize.height); 
     transform = CGAffineTransformRotate(transform, M_PI); 
     break; 

    case UIImageOrientationDownMirrored: //EXIF = 4 
     transform = CGAffineTransformMakeTranslation(0.0, imageSize.height); 
     transform = CGAffineTransformScale(transform, 1.0, -1.0); 
     break; 

    case UIImageOrientationLeftMirrored: //EXIF = 5 
     boundHeight = bounds.size.height; 
     bounds.size.height = bounds.size.width; 
     bounds.size.width = boundHeight; 
     transform = CGAffineTransformMakeTranslation(imageSize.height, imageSize.width); 
     transform = CGAffineTransformScale(transform, -1.0, 1.0); 
     transform = CGAffineTransformRotate(transform, 3.0 * M_PI/2.0); 
     break; 

    case UIImageOrientationLeft: //EXIF = 6 
     boundHeight = bounds.size.height; 
     bounds.size.height = bounds.size.width; 
     bounds.size.width = boundHeight; 
     transform = CGAffineTransformMakeTranslation(0.0, imageSize.width); 
     transform = CGAffineTransformRotate(transform, 3.0 * M_PI/2.0); 
     break; 

    case UIImageOrientationRightMirrored: //EXIF = 7 
     boundHeight = bounds.size.height; 
     bounds.size.height = bounds.size.width; 
     bounds.size.width = boundHeight; 
     transform = CGAffineTransformMakeScale(-1.0, 1.0); 
     transform = CGAffineTransformRotate(transform, M_PI/2.0); 
     break; 

    case UIImageOrientationRight: //EXIF = 8 
     boundHeight = bounds.size.height; 
     bounds.size.height = bounds.size.width; 
     bounds.size.width = boundHeight; 
     transform = CGAffineTransformMakeTranslation(imageSize.height, 0.0); 
     transform = CGAffineTransformRotate(transform, M_PI/2.0); 
     break; 

    default: 
     [NSException raise:NSInternalInconsistencyException format:@"Invalid image orientation"]; 

} 

UIGraphicsBeginImageContext(bounds.size); 

CGContextRef context = UIGraphicsGetCurrentContext(); 

if (orient == UIImageOrientationRight || orient == UIImageOrientationLeft) { 
    CGContextScaleCTM(context, -scaleRatio, scaleRatio); 
    CGContextTranslateCTM(context, -height, 0); 
} 
else { 
    CGContextScaleCTM(context, scaleRatio, -scaleRatio); 
    CGContextTranslateCTM(context, 0, -height); 
} 

CGContextConcatCTM(context, transform); 

CGContextDrawImage(UIGraphicsGetCurrentContext(), CGRectMake(0, 0, width, height), imgRef); 
UIImage *imageCopy = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

return imageCopy; 
} 

此:

int kMaxResolution = 2048; // Or whatever 

因为我在新的iPad使用的是分辨率

更多信息:http://blog.logichigh.com/2008/06/05/uiimage-fix/

1

你错过了一件事.. 设置根据AVCaptureVideoPreviewLayer方向应用程序的方向。

例如:

对于IOS 6及以上使用

previewLayer.connection.videoOrientation = AVCaptureVideoOrientationLandscapeLeft;

为IOS 5

previewLayer.orientation = AVCaptureVideoOrientationLandscapeLeft;

相关问题