以编程方式获取结合OpenGL和UIKit元素的屏幕截图 [英] Programmatically take a screenshot combining OpenGL and UIKit elements

查看:189
本文介绍了以编程方式获取结合OpenGL和UIKit元素的屏幕截图的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想知道是否有人可以提供如何拍摄混合OpenGL和UIKit元素的屏幕截图的示例。自从Apple制作了 UIGetScreenImage() private以来,这已成为一项非常困难的任务,因为Apple用来取代它的两种常用方法只捕获UIKit或仅捕获OpenGL。

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() private this has become a pretty difficult task because the two common methods Apple used to replace it capture only UIKit or only OpenGL.

类似问题参考 Apple的技术Q& A QA1714 ,但质量保证仅描述了如何处理来自相机和UIKit的元素。你如何将UIKit视图层次结构渲染到图像上下文中,然后在其上面绘制OpenGL ES视图的图像,就像类似问题的答案所示?

This similar question references Apple's Technical Q&A QA1714, but the QA only describes how to handle elements from the camera and UIKit. How do you go about rendering the UIKit view hierarchy into an image context and then drawing the image of your OpenGL ES view on top of it like the answer to the similar question suggests?

推荐答案

这应该可以解决问题。基本上将所有内容渲染为CG并创建图像,您可以做任何事情。

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

然后,创建屏幕截图

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

这篇关于以编程方式获取结合OpenGL和UIKit元素的屏幕截图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆