Programmatically take a screenshot combining OpenGL and UIKit elements

后端 未结 1 746
春和景丽
春和景丽 2021-02-10 13:11

I was wondering if anyone could provide an example of how to take a screenshot which mixes OpenGL and UIKit elements. Ever since Apple made UIGetScreenImage() priva

相关标签:
1条回答
  • 2021-02-10 14:01

    This should do the trick. Basically rendering everything to CG and creating an image you can do whatever with.

    // 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;
    }
    

    Then, to create a screenshot

    UIImage *glImage = [self drawGlToImage];
    UIImage *screenshot = [self createSavableImage:glImage];
    
    0 讨论(0)
提交回复
热议问题