2012-07-02 19 views
5

Me preguntaba si alguien podría proporcionar un ejemplo de cómo tomar una captura de pantalla que mezcle elementos de OpenGL y UIKit. Desde que Apple hizo UIGetScreenImage() como privada, se ha convertido en una tarea bastante difícil porque los dos métodos comunes que Apple usó para reemplazarlo capturan solo UIKit o solo OpenGL.Tomar una captura de pantalla mediante programación combinando los elementos de OpenGL y UIKit

This pregunta similar referencias Apple's Technical Q&A QA1714, pero el control de calidad solo describe cómo manejar los elementos de la cámara y el UIKit. ¿Cómo se hace para hacer que la jerarquía de vistas de UIKit se convierta en un contexto de imagen y luego dibujar la imagen de su vista de OpenGL ES encima, como sugiere la respuesta a una pregunta similar?

+0

, alternativamente, ¿hay un sustituto adecuado para UIGetScreenImage que se ocuparía de las dos cosas? – Austin

Respuesta

4

Esto debería hacer el truco. Básicamente renderizar todo a CG y crear una imagen con la que puedes hacer lo que sea.

// In Your UI View Controller 

- (UIImage *)createSavableImage:(UIImage *)plainGLImage 
{  
    UIImageView *glImage = [[UIImageView alloc] initWithImage:[myGlView drawGlToImage]]; 
    glImage.transform = CGAffineTransformMakeScale(1, -1); 

    UIGraphicsBeginImageContext(self.view.bounds.size); 

    //order of getting the context depends on what should be rendered first. 
    // this draws the UIKit on top of the gl image 
    [glImage.layer renderInContext:UIGraphicsGetCurrentContext()]; 
    [someUIView.layer renderInContext:UIGraphicsGetCurrentContext()]; 

    UIImage *finalImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    // Do something with resulting image 
    return finalImage; 
} 

// In Your GL View 

- (UIImage *)drawGlToImage 
{ 
    // Draw OpenGL data to an image context 

    UIGraphicsBeginImageContext(self.frame.size); 

    unsigned char buffer[320 * 480 * 4]; 

    CGContextRef aContext = UIGraphicsGetCurrentContext(); 

    glReadPixels(0, 0, 320, 480, GL_RGBA, GL_UNSIGNED_BYTE, &buffer); 

    CGDataProviderRef ref = CGDataProviderCreateWithData(NULL, &buffer, 320 * 480 * 4, NULL); 

    CGImageRef iref = CGImageCreate(320,480,8,32,320*4, CGColorSpaceCreateDeviceRGB(), kCGImageAlphaLast, ref, NULL, true, kCGRenderingIntentDefault); 

    CGContextScaleCTM(aContext, 1.0, -1.0); 
    CGContextTranslateCTM(aContext, 0, -self.frame.size.height); 

    UIImage *im = [[UIImage alloc] initWithCGImage:iref]; 

    UIGraphicsEndImageContext(); 

    return im; 
} 

Entonces, para crear una captura de pantalla

UIImage *glImage = [self drawGlToImage]; 
UIImage *screenshot = [self createSavableImage:glImage]; 
Cuestiones relacionadas