Ios 仅获取白色屏幕截图
我可以读取条形码,但无法获取屏幕快照。getScreenImage函数获得一个白色屏幕。如何获取屏幕截图,包括我看到的摄像头视图屏幕?多谢各位Ios 仅获取白色屏幕截图,ios,objective-c,screenshot,avcapturesession,avcapture,Ios,Objective C,Screenshot,Avcapturesession,Avcapture,我可以读取条形码,但无法获取屏幕快照。getScreenImage函数获得一个白色屏幕。如何获取屏幕截图,包括我看到的摄像头视图屏幕?多谢各位 @interface igViewController () <AVCaptureMetadataOutputObjectsDelegate,AVCaptureVideoDataOutputSampleBufferDelegate> { AVCaptureSession *_session; AVCaptureDevice *
@interface igViewController () <AVCaptureMetadataOutputObjectsDelegate,AVCaptureVideoDataOutputSampleBufferDelegate>
{
AVCaptureSession *_session;
AVCaptureDevice *_device;
AVCaptureDeviceInput *_input;
AVCaptureMetadataOutput *_output;
AVCaptureVideoPreviewLayer *_prevLayer;
UIView *_highlightView;
UILabel *_label;
UIImage *img;
}
@end
- (void)viewDidLoad
{
[super viewDidLoad];
_highlightView = [[UIView alloc] init];
_highlightView.autoresizingMask = UIViewAutoresizingFlexibleTopMargin|UIViewAutoresizingFlexibleLeftMargin|UIViewAutoresizingFlexibleRightMargin|UIViewAutoresizingFlexibleBottomMargin;
_highlightView.layer.borderColor = [UIColor greenColor].CGColor;
_highlightView.layer.borderWidth = 3;
[self.view addSubview:_highlightView];
_label = [[UILabel alloc] init];
_label.frame = CGRectMake(0, self.view.bounds.size.height -100, self.view.bounds.size.width, 100);
_label.autoresizingMask = UIViewAutoresizingFlexibleTopMargin;
_label.backgroundColor = [UIColor colorWithWhite:0.15 alpha:0.65];
_label.textColor = [UIColor whiteColor];
_label.textAlignment = NSTextAlignmentCenter;
//[_label addObserver:self forKeyPath:@"text" options:NSKeyValueObservingOptionNew context:NULL];
[self.view addSubview:_label];
_session = [[AVCaptureSession alloc] init];
_device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
NSError *error = nil;
_input = [AVCaptureDeviceInput deviceInputWithDevice:_device error:&error];
if (_input) {
[_session addInput:_input];
} else {
NSLog(@"Error: %@", error);
}
_output = [[AVCaptureMetadataOutput alloc] init];
[_output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
[_session addOutput:_output];
_output.metadataObjectTypes = [_output availableMetadataObjectTypes];
_prevLayer = [AVCaptureVideoPreviewLayer layerWithSession:_session];
_prevLayer.frame = self.view.bounds;
_prevLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
[self.view.layer addSublayer:_prevLayer];
[_session startRunning];
[self.view bringSubviewToFront:_highlightView];
[self.view bringSubviewToFront:_label];
}
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection
{
CGRect highlightViewRect = CGRectZero;
AVMetadataMachineReadableCodeObject *barCodeObject;
detectionString = nil;
NSArray *barCodeTypes = @[AVMetadataObjectTypeUPCECode, AVMetadataObjectTypeCode39Code, AVMetadataObjectTypeCode39Mod43Code,
AVMetadataObjectTypeEAN13Code, AVMetadataObjectTypeEAN8Code, AVMetadataObjectTypeCode93Code, AVMetadataObjectTypeCode128Code,
AVMetadataObjectTypePDF417Code, AVMetadataObjectTypeQRCode, AVMetadataObjectTypeAztecCode];
for (AVMetadataObject *metadata in metadataObjects) {
for (NSString *type in barCodeTypes) {
if ([metadata.type isEqualToString:type])
{
barCodeObject = (AVMetadataMachineReadableCodeObject *)[_prevLayer transformedMetadataObjectForMetadataObject:(AVMetadataMachineReadableCodeObject *)metadata];
highlightViewRect = barCodeObject.bounds;
detectionString = [(AVMetadataMachineReadableCodeObject *)metadata stringValue];
break;
}
}
_highlightView.frame = highlightViewRect;
if (detectionString != nil)
{ NSDictionary *outputSettings = [[NSDictionary alloc] initWithObjectsAndKeys: AVVideoCodecJPEG, AVVideoCodecKey, nil];
[self getScreenImage];
_label.text = detectionString;
[self performSelector:@selector(changeText) withObject:nil afterDelay:2.0];
break;
}
}
if(detectionString!=nil){
[MainViewController setResultTexts:detectionString img:img];
detectionString=nil;
[self dismissViewControllerAnimated:YES completion:nil];
[_session stopRunning];
}
}
CGImageRef UIGetScreenImage(void);
-(void)getScreenImage{
if(detectionString!=nil){
CGImageRef screen = UIGetScreenImage();
img = [UIImage imageWithCGImage:screen];
CGImageRelease(screen);
}
}
在这里试试这个contentScrollview是我的scrollview我正在将scrollview中的所有内容作为屏幕截图,您可以用视图对象替换它
- (UIImage *) imageFromViewIniOS7
{
UIImage* image = nil;
UIGraphicsBeginImageContext(contentScrollview.contentSize);
{
CGPoint savedContentOffset = contentScrollview.contentOffset;
CGRect savedFrame = contentScrollview.frame;
contentScrollview.contentOffset = CGPointZero;
contentScrollview.frame = CGRectMake(0, 0, contentScrollview.contentSize.width, contentScrollview.contentSize.height);
if ([[NSString versionofiOS] intValue]>=7)
{
[contentScrollview drawViewHierarchyInRect:contentScrollview.bounds afterScreenUpdates:YES];
}
else
{
[contentScrollview.layer renderInContext: UIGraphicsGetCurrentContext()];
}
image = UIGraphicsGetImageFromCurrentImageContext();
contentScrollview.contentOffset = savedContentOffset;
contentScrollview.frame = savedFrame;
}
UIGraphicsEndImageContext();
return image;
}
我使用了AVCaptureStillImageOutput,它工作正常
-(void)captureNow {
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;
}
}
[_stillImageOutput captureStillImageAsynchronouslyFromConnection:videoConnection completionHandler: ^(CMSampleBufferRef imageSampleBuffer, NSError *error)
{
NSData *imageData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageSampleBuffer];
img = [[UIImage alloc] initWithData:imageData];
//I used image in another viewcontroller
[MainViewController setResultTexts:str img:img];
[MainViewController set_from_view:0 scanner:1];
[self dismissViewControllerAnimated:YES completion:nil];
}];
}
如果您的部署目标是iOS 7.x及更高版本,请使用
SnapshotViewAfterScreenUpdate:
,可调整大小的SnapshotViewfromRect:AfterScreenUpdate:with capinsets:
,或drawViewHierarchyInRect:AfterScreenUpdate:
。您只需要捕获包含所有元素的屏幕?@Charan:是的。这就是我需要的。@N00B程序员:谢谢。但仍然是白色屏幕。在ViewDidApparit中执行此操作不起作用。我检查了我想要的屏幕。这是AVCaptureVideoPreviewLayer。无法访问renderInContext的层。我想这就是为什么截图总是白色的。
-(void)captureNow {
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;
}
}
[_stillImageOutput captureStillImageAsynchronouslyFromConnection:videoConnection completionHandler: ^(CMSampleBufferRef imageSampleBuffer, NSError *error)
{
NSData *imageData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageSampleBuffer];
img = [[UIImage alloc] initWithData:imageData];
//I used image in another viewcontroller
[MainViewController setResultTexts:str img:img];
[MainViewController set_from_view:0 scanner:1];
[self dismissViewControllerAnimated:YES completion:nil];
}];
}