2014-04-11 3 views
0

라이브 카메라보기 피드에 AVCaptureSession을 사용하고 있는데 카메라 오버레이보기에서 일부 이미지를 렌더링합니다. 나는 EAGLView를 사용하지 않았고, AVCaptureSession을 미리보기 레이어와 함께 사용하여 일부 이미지를 오버레이했습니다. 나는 스크린 샷 라이브 카메라 피드 이미지와 오버레이 이미지를 가져 가고 싶다. 그래서, 일부 링크를 마지막으로 glReadPixel() 함께 찾았지만이 코드를 구현할 때 검정 이미지를 반환합니다. 방금 OpenGLES.framework 라이브러리를 추가하고 가져 왔습니다.glReadPixel() 검은 색 이미지를 반환합니다.

- (UIImage*) glToUIImage 

{ 
CGFloat scale = [[UIScreen mainScreen] scale]; 
// CGRect s = CGRectMake(0, 0, 320.0f * scale, 480.0f * scale); 

CGRect s = CGRectMake(0, 0, 768.0f * scale, 1024.0f * scale); 

uint8_t *buffer = (uint8_t *) malloc(s.size.width * s.size.height * 4); 



glReadPixels(0, 0, s.size.width, s.size.height, GL_RGBA, GL_UNSIGNED_BYTE, buffer); 

CGDataProviderRef ref = CGDataProviderCreateWithData(NULL, buffer, s.size.width * s.size.height * 4, NULL); 


CGImageRef iref = CGImageCreate(s.size.width, s.size.height, 8, 32, s.size.width * 4, CGColorSpaceCreateDeviceRGB(), kCGBitmapByteOrderDefault, ref, NULL, true, kCGRenderingIntentDefault); 


size_t width = CGImageGetWidth(iref); 
size_t height = CGImageGetHeight(iref); 
size_t length = width * height * 4; 
uint32_t *pixels = (uint32_t *)malloc(length); 



CGContextRef context1 = CGBitmapContextCreate(pixels, width, height, 8, width * 4, 
CGImageGetColorSpace(iref), kCGImageAlphaNoneSkipFirst | kCGBitmapByteOrder32Big); 


CGAffineTransform transform = CGAffineTransformIdentity; 
transform = CGAffineTransformMakeTranslation(0.0f, height); 
transform = CGAffineTransformScale(transform, 1.0, -1.0); 
CGContextConcatCTM(context1, transform); 
CGContextDrawImage(context1, CGRectMake(0.0f, 0.0f, width, height), iref); 
CGImageRef outputRef = CGBitmapContextCreateImage(context1); 


outputImage = [UIImage imageWithCGImage: outputRef]; 


CGDataProviderRelease(ref); 
CGImageRelease(iref); 
CGContextRelease(context1); 
CGImageRelease(outputRef); 
free(pixels); 
free(buffer); 




UIImageWriteToSavedPhotosAlbum(outputImage, nil, nil, nil); 

NSLog(@"Screenshot size: %d, %d", (int)[outputImage size].width, (int)[outputImage size].height); 

return outputImage; 

} 


-(void)screenshot:(id)sender{ 

[self glToUIImage]; 


} 

을하지만 검은 색 이미지를 반환

- (void)viewDidLoad 
{ 
[super viewDidLoad]; 

[self setCaptureSession:[[AVCaptureSession alloc] init]]; 


[self addVideoInputFrontCamera:NO]; // set to YES for Front Camera, No for Back camera 

[self addStillImageOutput]; 

[self setPreviewLayer:[[AVCaptureVideoPreviewLayer alloc] initWithSession:[self captureSession]] ]; 



[[self previewLayer] setVideoGravity:AVLayerVideoGravityResizeAspectFill]; 



CGRect layerRect = [[[self view] layer] bounds]; 


[[self previewLayer]setBounds:layerRect]; 
[[self previewLayer] setPosition:CGPointMake(CGRectGetMidX(layerRect),CGRectGetMidY(layerRect))]; 
[[[self view] layer] addSublayer:[self previewLayer]]; 


[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(saveImageToPhotoAlbum) name:kImageCapturedSuccessfully object:nil]; 


[[self captureSession] startRunning]; 


UIImageView *dot =[[UIImageView alloc] initWithFrame:CGRectMake(50,50,200,200)]; 
dot.image=[UIImage imageNamed:@"draw.png"]; 
[self.view addSubview:dot]; 

} 

glReadPixel를 사용하여 오버레이 컨텐츠()와 함께 라이브 카메라 피드를 캡처.

enter image description here

+0

스크린 샷을 찍고 싶거나 카메라에서 원본 이미지를 캡처하려는 경우 귀하의 게시물에서 불분명합니다. glReadPixel은 단순히 OpenGL renderBuffer를 반환합니다. OpenGL을 사용하고있는 것처럼 보이지 않기 때문에 반환되는 항목을 얻지 못할 것입니다. 화면 캡처의 경우이 스레드, 특히 마지막 게시물을 따라갈 수 있습니다. http://stackoverflow.com/questions/2200736/how-to-take-a-screenshot-programmatically – MDB983

+0

화면 캡처를 원하지 않습니다. 원시 이미지 (라이브 카메라)가 필요하고 이미지와 같은 오버레이 컨텐트가 필요합니다. 첨부 된 증강 현실 이미지를 참조하십시오. 라이브 카메라 및 오버레이 콘텐츠를 캡처해야합니다. – user3496826

+0

다음은 Camera Capture에서 이미지를 생성하는 방법을 설명하는 Apple Docs에 대한 참조입니다. https://developer.apple.com/library/ios/qa/qa1702/_index.html#//apple_ref/doc/uid/DTS40010192. Apple 개발자 인 "RosyWriter"샘플 애플리케이션은 이미지 버퍼를 가져 오거나 추출한 다음 각 픽셀에 색조를 적용한 다음 수정 된 픽셀 버퍼를 OpenGL을 통해 표시합니다. 사과 pARK 예제는 카메라 피드의 위치를 ​​오버레이하는 방법을 보여줍니다. AR SDK를 사용하는 것이 더 간단 할 수도 있지만 취할 수있는 방법에는 여러 가지가 있습니다. 추가 정보/도움이 필요하면 알려주세요. – MDB983

답변

0

glReadPixels()는 AV 재단 미리 층 작동하지 않습니다. 픽셀을 캡처하는 OpenGL ES 컨텍스트가 없으며 장면이 디스플레이에 표시되기 전에 캡처해야합니다.

카메라에서 라이브 비디오 위에 중첩 된 이미지를 캡처하려는 경우 내 GPUImage 프레임 워크가이를 처리 할 수 ​​있습니다. GPUImageVideoCamera, 오버레이에 필요한 GPUImagePicture 인스턴스 및 일종의 블렌드 필터를 설정하기 만하면됩니다. 그런 다음 디스플레이를 위해 GPUImageView에 출력을 공급하고 언제든지 블렌드 필터에서 스틸 이미지를 캡처 할 수 있습니다. 프레임 워크는이 모든 작업을 통해 무거운 짐을 처리합니다.

+0

시도 할 것입니다. 감사... – user3496826

관련 문제