2014-06-17 3 views
1

세로 모드에서 카메라를 누른 다음 세로 모드를 반환하는 스냅 샷을 찍으면 나는 openGL 스크린 샷을 찍고 있습니다. 그러나 세로 모드에서 카메라를 가로 모드로 돌린 다음 스크린 샷을 찍으면 세로 모드 스크린 샷 만 반환됩니다. 하지만 내 카메라보기에서는 라이브 스트림 풀 모드와 스크린 샷 저장 1024X768을 보여줍니다.가로 화면 캡처 세로 모드 화면을 반환합니다.

ImageTargetsEAGLView.mm :

- (BOOL)presentFramebuffer 

{ 

    if (_takePhotoFlag1) 

{ 

    [self glToUIImage1]; 

    UIImageWriteToSavedPhotosAlbum([self glToUIImage1], nil, nil, nil); 

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

_takePhotoFlag1 = NO; 

    }  

     // setFramebuffer must have been called before presentFramebuffer, therefore 

    // we know the context is valid and has been set for this (render) thread 



    // Bind the colour render buffer and present it 

    glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer); 



    return [context presentRenderbuffer:GL_RENDERBUFFER]; 

} 





- (UIImage*) glToUIImage1 

{ 

UIImage *outputImage = nil; 



    UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation; 

     if (UIInterfaceOrientationIsLandscape(orientation)) 

     { 

      NSLog(@"landscape screen"); 

      CGRect screenBounds = [[UIScreen mainScreen] bounds]; 

    // CGFloat scale = [[UIScreen mainScreen] scale]; 

      // CGRect s = CGRectMake(0, 0, 320.0f * scale, 480.0f * scale); 

       CGRect s = CGRectMake(0, 0, 1024 , 768); 

      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); 



     }else{ 



     NSLog(@"portrait screen"); 



     // CGFloat scale = [[UIScreen mainScreen] scale]; 

      // CGRect s = CGRectMake(0, 0, 320.0f * scale, 480.0f * scale); 



      CGRect s = CGRectMake(0, 0, 768, 1024); 



      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); 





     } 





     return outputImage; 



    } 



} 
+0

a) SS를 보는 방법과 b) 풍경 SS를 일반 초상화 SS처럼 보이게 할 수 있습니까? 또는 당신이 풍경 SS를 가져 와서 그것의쪽으로 회전 시켰던 것처럼? –

+0

이 스크린 샷을 확인하십시오. https://developer.vuforia.com/sites/default/files/landscape_Screen.JPG를 저장하는 동안 검은 색으로 변합니다. – user3743552

+0

문제는 제가 세로 모드로 앱을 열고 캡쳐 화면을 작동시키는 것입니다 . 가로 모드에서 앱을 열면 스크린 샷이 작동합니다. 그러나 내가 초상화에서 풍경으로 회전하면 화면이 검은 색으로 표시되는 스크린 샷을 찍습니다. – user3743552

답변

0

나는 당신이 당신의 코드와 같은 문제가없는,하지만 난 방법은 여기 내가 사용 제안 등 아티팩트를받을 수 있나요 : http://www.unagames.com/blog/daniele/2011/10/opengl-es-screenshots-ios 그것은 일 완벽하게 당신을위한 드롭 인 대체품 (GLKViewController를 사용하는 경우 eaglview로 self.view를 제공) 실제로 OpenGL ES 컨텍스트에서 SS에 대한 정확한 크기를 가져오고 있으므로 항상 올바른 ^^

+0

링크에서 코드는 세로 모드에서 ss를 사용합니다. 하지만 제가 풍경에 있다면 여전히 그 코드는 초상화를 사용하는 것입니다. 가로 모드 코드를 어떻게 바꿀 수 있습니까? – user3743552