ios objective C截图子层不可见

时间:2015-10-19 08:15:04

标签: ios objective-c xcode

我正在构建一个应用程序,我想从相机拍摄快照并在UIImageView中显示它。我可以拍摄快照但AVCaptureVideoPreviewLayer在屏幕截图中不可见。有谁知道这是怎么做到的吗? 这是我的代码:

@implementation ViewController
CGRect imgRect;
AVCaptureVideoPreviewLayer *previewLayer;
AVCaptureVideoDataOutput *output;

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    //Capture Session
    AVCaptureSession *session = [[AVCaptureSession alloc]init];
    session.sessionPreset = AVCaptureSessionPresetPhoto;

    //Add device
    AVCaptureDevice *device =
    [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];

    //Input
    AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:nil];

    if (!input)
    {
        NSLog(@"No Input");
    }

    [session addInput:input];

    //Output
    output = [[AVCaptureVideoDataOutput alloc] init];
    [session addOutput:output];
    output.videoSettings = @{ (NSString *)kCVPixelBufferPixelFormatTypeKey : @(kCVPixelFormatType_32BGRA) };

    //Preview
    previewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session];

    CGFloat x = self.view.bounds.size.width * 0.5 - 128;
    imgRect = CGRectMake(x, 64, 256, 256);
    previewLayer.frame = imgRect;
    previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
    [self.view.layer addSublayer:previewLayer];

    //Start capture session
    [session startRunning];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (IBAction)TakeSnapshot:(id)sender {
    self.imgResult.image = self.pb_takeSnapshot;
}

- (UIImage *)pb_takeSnapshot {
    UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, NO, [UIScreen mainScreen].scale);
    [self.view drawViewHierarchyInRect:self.view.bounds afterScreenUpdates:YES];

    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return image;
}
@end

非常感谢一点帮助。 提前谢谢

Gilbert Avezaat

2 个答案:

答案 0 :(得分:0)

首先检查Image是否返回。如果再回来......

- (IBAction)TakeSnapshot:(id)sender {

self.imgResult.image = self.pb_takeSnapshot;

[self.view bringSubviewToFrunt:self.imgResult];

}

希望对你有所帮助。

答案 1 :(得分:0)

你应该使用AVCaptureStillImageOutput从相机连接中获取图像,

以下是你如何做到的,

    AVCaptureStillImageOutput *stillImageOutput = [[AVCaptureStillImageOutput alloc] init];
    stillImageOutput.outputSettings = @{
                                        AVVideoCodecKey: AVVideoCodecJPEG,
                                        (__bridge id)kCVPixelBufferPixelFormatTypeKey: @(kCVPixelFormatType_32BGRA)
                                        };
    [stillImageOutput captureStillImageAsynchronouslyFromConnection:connection completionHandler:^(CMSampleBufferRef imageDataSampleBuffer, NSError *error) {

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